子流程.波彭:找不到mkvirtualenv



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

设置脚本包括:

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

谢谢你的回答。

mkvirtualenv可能是一个shell函数,它是通过从shell的启动文件中获取virtualenvwrapper.sh脚本添加到环境中的。在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)

编辑:

我了解到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(取决于您的shell)中设置$PATH,如下所示:

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

这样,mkvirtualenv脚本将被正确找到并运行。

另一种解决方案

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

最新更新