subprocess.Popen:找不到mkvirtualenv

时间:2013-08-20 14:33:46

标签: python virtualenvwrapper

我在部署中使用virtualenvwrapper。为了设置新环境,我正在运行一个包含所有必需步骤的python脚本。

setupscript包括:

cmd = 'mkvirtualenv %s --no-site-packages'%('testname')
head = subprocess.Popen(cmd,shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for line in head.stdout.read().splitlines():
    print line

输出结果为:

/bin/sh: mkvirtualenv: not found

如何在我的python脚本中正确使用virtualenvwrapper?

编辑:

以下代码适用于我:

cmd = 'source /usr/local/bin/virtualenvwrapper.sh && mkvirtualenv %s --no-site-packages'%('testname')
head = subprocess.Popen(cmd, executable='bash', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT)
for line in head.stdout.read().splitlines():
    print line

感谢所有答案。

2 个答案:

答案 0 :(得分:5)

mkvirtualenv可能是一个shell函数,它通过获取virtualenvwrapper.sh script from your shell's startup file添加到您的环境中。在shell=True上调用的默认命令(例如,/bin/sh -c ...)可能无法读取它。

您可以明确地提供文件:

import pipes
from subprocess import check_call

check_call("""source /path/to/virtualenvwrapper.sh &&
    mkvirtualenv --no-site-packages """ + pipes.quote(envname),
    executable='bash', shell=True)

答案 1 :(得分:1)

编辑:

我了解到mkvirtualenv是一个shell函数。在这种情况下,问题变为how to run shell function in python。我在下面的答案可以应用于独立的二进制文件。对于您的问题,请查看答案:https://stackoverflow.com/a/5826523/1906700您可以从定义它的脚本中间接调用mkvirtualenv()函数。

正确设置PATH变量

问题似乎是由$PATH变量引起的。您需要正确设置此变量,以便可以找到mkvirtualenv可执行文件。例如,如果在/ home / thore / scripts中有mkvirtualenv可执行文件,则需要在.bashrc或.zshrc中设置$ PATH(取决于你的shell),如下所示:

 export PATH=$PATH:/home/thore/scripts

通过这种方式,可以正确找到mkvirtualenv脚本并运行。

另一种解决方案

问题的另一个解决方案是使用相关脚本的确切路径。在这种情况下,您可以将/home/thore/scripts/mkvirtualenv作为参数提供给子流程。