将Python脚本作为子进程调用

将Python脚本作为子进程调用,python,subprocess,Python,Subprocess,我正在围绕一些python脚本创建一个包装器,当计算机上安装了多个python版本时,遇到了一个小问题。例如,在我的Mac上,可以通过命令行中的“python”访问python 2.7,也可以通过“python3”访问python 3.4。是否仍然需要确定当前python实例是如何启动的,以便我可以确定子流程将使用正确的版本 import subprocess def main(): pythonCommand = determineCommand() #What is python

我正在围绕一些python脚本创建一个包装器,当计算机上安装了多个python版本时,遇到了一个小问题。例如,在我的Mac上,可以通过命令行中的“python”访问python 2.7,也可以通过“python3”访问python 3.4。是否仍然需要确定当前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在我的计算机上工作,但在其他计算机上会破坏它

可以通过
sys.version\u info
检查正在执行的Python版本:

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\u 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))
导入系统 v=系统版本信息 如果sys.version_info.major<3: 引发异常(“不兼容的Python版本:%d.%d”%(v.major,v.minor))
可以通过
sys.version\u info
检查正在执行的Python版本:

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\u 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))
导入系统 v=系统版本信息 如果sys.version_info.major<3: 引发异常(“不兼容的Python版本:%d.%d”%(v.major,v.minor))
要获取用于启动当前Python解释器的可执行文件,请阅读。它是当前运行的Python解释器二进制文件的绝对路径(尽管它可以是空字符串或在奇怪的情况下是
None
,如冻结的可执行文件等)。

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

是否知道将调用该版本的命令行命令?比如我怎么知道在一些不寻常的安装上使用python3而不是python34?@user1593858如果你想查看完整的version\u info对象或者只想查看
python--version
的话,你可以在命令行上传递-c标志:
python-c“import sys;print sys.version\u info”
。我想问的问题还不清楚。我在问题中的代码中添加了一些内容,希望能够说明我正在尝试的内容ask@user1593858谢谢你的澄清。我想说的是,您不想依赖于用户调用python时使用的特定名称;例如,使用
export p=/usr/bin/python
,我可以在我的系统上将python 2.7解释器更一般地称为
$p
@user1593858,如果情况需要,我建议将代码更新为2.7兼容,或者在文档中详细说明支持哪些Python版本,如果检测到不正确的Python版本,则引发异常。如果您想支持2并继续编写3,请查看“是否仍有必要知道将调用该版本的命令行命令?”?比如我怎么知道在一些不寻常的安装上使用python3而不是python34?@user1593858如果你想查看完整的version\u info对象或者只想查看
python--version
的话,你可以在命令行上传递-c标志:
python-c“import sys;print sys.version\u info”
。我想问的问题还不清楚。我在问题中的代码中添加了一些内容,希望能够说明我正在尝试的内容ask@user1593858谢谢你的澄清。我想说的是,您不想依赖于用户调用python时使用的特定名称;例如,使用
export p=/usr/bin/python
,我可以在我的系统上将python 2.7解释器更一般地称为
$p
@user1593858,如果情况需要,我建议将代码更新为2.7兼容,或者在文档中详细说明支持哪些Python版本,如果检测到不正确的Python版本,则引发异常。如果要支持2并继续编写3,请查看相关:相关: