python-如何使用子进程运行virtualenv软件包安装

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

最初我使用:

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

从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_script(extra_text)(但无法弄清楚,并且我正在运行一些其他来自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."

警告:危险在下面!

为了&&要使用令牌,必须在subprocess.call中使用参数shell = True.但是,如果您要接受用户的输入,则绝对不能使用shell = True,因为这将允许任意代码执行.

此外,您需要将args一起加入.

如果您使用的是dir_name,则您正在对其进行硬编码:

cmdline = ' '.join(['virtualenv', dir_name, '&&', '{0}/bin/pip'.format(dir_name), 'install', 'processing'])
subprocess.call(
    cmdline,
    shell=True
)
上一篇:Python3在Windows下创建虚拟环境(virtualenv)


下一篇:cad相对坐标怎么输入?CAD中输入西安80坐标绘图的教程