通过subuprocess模块使用另一个python解释器运行python脚本?

7gcisfzg  于 2023-06-25  发布在  Python
关注(0)|答案(2)|浏览(114)

假设我有一个简单的Hello_World.py脚本,它将编写一个文本文件,内容是hello world。

import csv,sys

def main(fname):
    with open(fname, 'w') as f:
        writer = csv.writer(f)
        writer.writerow(['Hello World'])

if __name__ == '__main__':
    fname = sys.argv[1]
    main(fname)

我可以在特定python环境的命令提示符下使用

C:\Users\user\Anaconda3\envs\test\python.exe D:\Scripts\hello_world.py D:\Data\test.txt

但是,我如何从另一个Python版本中执行同一行代码,例如使用子进程模块?即,以下返回非零退出状态1。

subprocess.check_call([r'C:\Users\user\Anaconda3\envs\test\python.exe',r'D:\Scripts\hello_world.py', r'D:\Data\test.txt'])

当然不是最优雅的方法,但不幸的是,我需要在不同的python版本上运行脚本。考虑到调用python.exe也会失败,似乎在调用python.exe时出现了某种错误

os.system(r'C:\Users\user\Anaconda3\envs\test\python.exe')
kyxcudwk

kyxcudwk1#

如果没有更多的信息,就不可能知道脚本中到底出了什么问题(对我来说似乎运行得很好?)。要获得有关正在发生的事情的更多详细信息,您应该尝试访问进程stdoutstderr流,如注解中所建议的那样。
这可以使用类似以下脚本的东西来实现:

import subprocess

try:
    proc = subprocess.run(
        [
            r'C:\Users\user\Anaconda3\envs\test\python.exe', 
            r'D:\Scripts\hello_world.py', 
            r'D:\Data\test.txt'
        ],
        capture_output=True,
        check=True
    )
except subprocess.CalledProcessError as proc_err:
    print("An exception occurred in the subprocess: \n ", proc_err)
    print("stdout : \n", proc_err.stdout.decode())
    print("stderr : \n", proc_err.stderr.decode())
    exit(1)

print("stdout : \n", proc.stdout.decode())
print("stderr : \n", proc.stderr.decode())
j1dl9f46

j1dl9f462#

问题已解决。我没有权限访问指定的C文件夹。为什么subprocess.CalledProcessError函数没有抛出权限错误,我不知道。

相关问题