Python 未找到subprocess.Popen:mkvirtualenv

Python 未找到subprocess.Popen:mkvirtualenv,python,virtualenvwrapper,Python,Virtualenvwrapper,我正在部署中使用VirtualVWrapper。为了设置新的环境,我正在运行一个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().spli

我正在部署中使用VirtualVWrapper。为了设置新的环境,我正在运行一个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脚本中正确使用VirtualNVRapper

编辑: 以下代码适用于我:

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函数。在这种情况下,问题变成了如何在python中运行shell函数。我下面的答案可以应用于独立二进制文件。对于您的问题,请看答案:您可以从定义mkvirtualenv()函数的脚本中间接调用它

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

 export PATH=$PATH:/home/thore/scripts
这样,
mkvirtualenv
脚本将被正确找到并运行

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

mkvirtualenv
可能是通过源代码添加到环境中的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)

mkvirtualenv
不是脚本。这是一个shell函数。啊,那么问题就变成了如何在python脚本中运行bash函数。更新注释。值得注意的是,您的源代码行将在除您自己的计算机之外的大多数计算机上中断。如果你想让它在其他人的机器上运行,请告诉我,我可以为你编写一些bash,但如果你只想在本地机器上运行,那就好了。整个安装脚本是为特殊的服务器布局编写的,因此对我来说,目前不需要通用解决方案。