我正在为我的一个程序编写一个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的其他脚本)
想知道我在子流程中做错了什么或者我可以改变什么。
谢谢!
答案 0 :(得分: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,因为它将允许任意代码执行。
此外,您需要将args加在一起。
如果你使用的是dir_name,那么你很难编码:
cmdline = ' '.join(['virtualenv', dir_name, '&&', '{0}/bin/pip'.format(dir_name), 'install', 'processing'])
subprocess.call(
cmdline,
shell=True
)