4

我在部署中使用 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

感谢所有的答案。

4

2 回答 2

5

mkvirtualenv可能是一个 shell 函数,它通过virtualenvwrapper.sh从 shell 的启动文件中获取脚本添加到您的环境中。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)
于 2013-08-20T15:17:53.653 回答
1

编辑:

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

正确设置 PATH 变量

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

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

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

另一种解决方案

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

于 2013-08-20T14:38:16.703 回答