调用 Python 脚本作为子进程

Invoking Python Script as Subprocess

我正在围绕一些 python 脚本创建一个包装器,当计算机上安装了多个版本的 python 时,运行 遇到了一个小问题。例如,在我的 Mac 上,python 2.7 可通过 "python" 在命令行访问,python 3.4 可用 "python3"。无论如何确定当前 python 实例是如何启动的,以便我可以确定子进程将使用正确的版本?

import subprocess

def main():
    pythonCommand = determineCommand() #What is python install as on this computer
    argArray = [pythonCommand, "test.py"] #requires python 3.4
    subprocess.call(argArray)

#What I need to figure out
def determineCommand():
    #If Some Check
        return "python3"
    #Else some other check
        return "python"
    #else something weird
        return "python34"
    #and so on

if __name__ == "__main__":
    main()

以上代码在我的电脑上无法正常执行,但在只安装了 python 3.4 的电脑上运行正常。将 argArray 更改为使用 python3 可以在我的计算机上运行,​​但在其他计算机上会损坏。

正在执行的 Python 的版本可以通过 sys.version_info:

检查
chuck@computer:~$ python
>>> import sys; sys.version_info
sys.version_info(major=2, minor=7, micro=10, releaselevel='final', serial=0)
>>> exit()

chuck@computer:~$ python3
>>> import sys; sys.version_info
sys.version_info(major=3, minor=4, micro=3, releaselevel='final', serial=0)
>>> 

version_info 属性在所有 Python 版本 >= 2.0 中可用。

如果您需要某个版本,可以在您的模块中添加一个检查:

import sys
v = sys.version_info

if sys.version_info.major < 3:
    raise Exception("Incompatible Python version: %d.%d" % (v.major, v.minor))

要获取用于启动当前 Python 解释器的可执行文件,请阅读 sys.executable。它是当前 运行 Python 解释器二进制文件的绝对路径(尽管在奇怪的情况下它可以是空字符串或 None,例如冻结的可执行文件等)。