如何使用subprocess运行virtualenv软件包安装

3
我正在为我的一个程序编写Bootstrap代码,并尝试使用subprocess.call将其安装到我的虚拟环境目录中。
最初我使用的是:
subprocess.call(['pip', 'install', '-E', dir_name, 'processing'])

当在Ubuntu上重新运行时,我注意到-E已经过时(http://pypi.python.org/pypi/pip/),需要使用:

virtualenv dir_name && dir_name/bin/pip install processing

这在命令行中运行良好,但在子进程中无法工作:
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_script(extra_text)(但无法理解并且有一些额外的脚本是从git运行的)

想知道我在subprocess中做错了什么或者我能改变什么。

谢谢!

1个回答

3

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

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."

警告:下面有危险!

为了让 && 标记起作用,你必须在 subprocess.call 中使用参数 shell=True。然而,如果你正在接受来自用户的输入,绝不能使用 shell=True,因为它将允许任意代码执行。

此外,你需要将参数连接起来。

如果你正在使用硬编码的 dir_name:

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

1
谢谢!subprocess.call(['{0}/bin/pip'.format(dir_name), 'install', 'processing']) 成功了! - gina turco
抱歉,在我完成输入和修复编辑之前,我按下了回车键。 - gina turco

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接