Python 如何使用子流程运行virtualenv软件包安装

Python 如何使用子流程运行virtualenv软件包安装,python,virtualenv,pip,Python,Virtualenv,Pip,我正在为我的一个程序编写引导代码,并尝试使用subprocess.call安装到我的virtualenv目录 最初我使用: subprocess.call(['pip', 'install', '-E', dir_name, 'processing']) 在ubuntu上重新运行时,我注意到-E已经过时了(),需要使用: virtualenv dir_name && dir_name/bin/pip install processing 这在cmd行中可以正常工作,但在子流程

我正在为我的一个程序编写引导代码,并尝试使用subprocess.call安装到我的virtualenv目录

最初我使用:

subprocess.call(['pip', 'install', '-E', dir_name, 'processing'])
在ubuntu上重新运行时,我注意到-E已经过时了(),需要使用:

virtualenv dir_name && dir_name/bin/pip install processing
这在cmd行中可以正常工作,但在子流程中不起作用:

subprocess.call(['virtualenv', dir_name, '&&', '{0}/bin/pip'.format(dir_name), 'install', 'processing'])
返回此错误消息:

There must be only one argument: DEST_DIR (you gave dir_name && dir_name/bin/pip install   processing)
Usage: virtualenv [OPTIONS] DEST_DIR
我还尝试了virtualenv.create_bootstrap_脚本(额外的文本)(但无法理解,我正在运行一些来自git的其他脚本)

想知道我在子流程中做错了什么,或者我可以改变什么


谢谢

只需检查第一个命令的状态,然后有条件地运行第二个命令:

retval = subprocess.call(
    ['virtualenv', dir_name]
)
if retval == 0:
    # a 0 return code indicates success
    retval = subprocess.call(
        ['{0}/bin/pip'.format(dir_name), 'install', 'processing']
    )
    if retval == 0:
        print "ERROR: Failed to install package 'processing'"
else:
    print "ERROR: Failed to created virtualenv properly."
警告:下面有危险

为了使
&&
标记工作,必须在
子流程.call
中使用参数shell=True。但是,如果接受用户的输入,则不能使用shell=True,因为这样会允许执行任意代码

此外,还需要将arg连接在一起

如果您使用的是硬编码的目录名称:

cmdline = ' '.join(['virtualenv', dir_name, '&&', '{0}/bin/pip'.format(dir_name), 'install', 'processing'])
subprocess.call(
    cmdline,
    shell=True
)

谢谢subprocess.call(['{0}/bin/pip'.format(dir_name),'install','processing'])有效!很抱歉,在键入所有内容并修复编辑之前,我按了enter键