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

标签 python virtualenv pip

我正在为我的一个程序编写 Bootstrap 代码,并尝试使用 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,因为这样会允许任意代码执行。

此外,您需要将参数连接在一起。

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

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

关于python - 如何使用子进程运行 virtualenv 包安装,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11438727/

相关文章:

python - 在 Paraview 中合并来自多个文件的 PointData

python - 你如何在已经创建的 virtualenv 中设置你的 pythonpath?

python - pip 可编辑安装在只读文件系统上

python3requirements.txt 文件显示不需要的包

python - 在没有任何 python 子包的情况下创建 pip 轮

python - Pyspark 从数据框中的列中删除空值

python - 如何确定 KeyError 的来源?

python - 如何分隔 'di' 单词中的前缀?

pytorch - 在 PythonVirtualenvOperator 中使用除 pip 之外的其他来源下载

python - 如何让 VirtualEnv TensorFlow 在 PyCharm 中工作?