【发布时间】:2018-08-30 16:37:41
【问题描述】:
我需要在 Popen 中运行 python 命令。问题是命令需要在 python3 中运行并且我需要它是可移植的,这意味着我不能在每种情况下都使用 python3 别名......
我的计算机中python 已经是正确的版本,而其他计算机的正确版本是python3。我尝试在文件开头插入#!/usr/bin python3,然后以python 运行,但没有成功。
我无法修改环境变量以将 python3 更改为 python。我想知道是否有一种方法可以检查我需要使用哪个,或者只有在 Popen 命令中才能将 python3 更改为 python...
我尝试运行的 Popen 命令非常简单,不,我不能只导入文件并用作类...它需要通过 Popen 运行。此外,virtualenv 或类似的也不是一个选项。
subprocess.Popen(['python', 'main.py'], shell=True, universal_newlines=True)
【问题讨论】:
-
shell=True在这里破坏了您的代码:它运行的内容等同于命令sh -c 'python' 'main.py';您可以在 shell 中测试它在那里也不起作用(因为只有紧接在-c之后的参数被视为 shell 脚本;之后的参数变为$0、$1等,但该脚本没有t 寻找它们,因此它们被忽略)- 而使用shell=False,您运行的内容相当于(shell 命令)python main.py。 -
@CharlesDuffy 真的吗?您可以直接从控制台运行
python main.py吗? -
python main.py在 shell 提示符下工作,sh -c python main.py不工作(对于“不起作用”的值,其中main.py参数被忽略) -
你也可以在交互式shell中通过比较
echo hello和sh -c echo hello来测试这个;在sh -c-- 由 Python 的shell=True添加 -- 前面,hello被忽略,只有一个空行是echoed。 -
...无论如何,转向您的主要问题:如果您已经在必要的平台上将 shebang 更改为
#!/usr/bin/python3,那么剩下的唯一必要的事情就是运行/path/to/yourscript而不是python /path/to/yourscript,所以shebang很荣幸。所以subprocess.Popen(['./main.py'])将尊重#!/usr/bin/python3或#!/usr/bin/python或#!/usr/bin/env python3或任何它。
标签: python python-3.x subprocess popen