使用subprocess.call()运行bin/buildout失败



tl,dr:我的建筑物与外壳的" bin/buildout"正常工作,但是当我运行subprocess.call.call([" bin/buildout")或类似时失败来自Python。为什么?有解决方法吗?

我添加了" python"标签,而不是仅仅是" buildOut",因为这可能是使用subprocess.call()或os.system()从python调用shell vs vs shell vs的python脚本的微妙差异。我不知道为什么他们会有所不同。不过,这可能是一件建筑事物,因为BuildOut会重写自身,然后重新启动。

要构建我要显示的示例,我从一个新的Ubuntu 12.04 LTS虚拟框开始。然后,我在其中安装git(sudo apt-get安装git),然后克隆我们的一个存储库之一,它几乎没有任何内容:

git clone git://github.com/lizardsystem/lizard-datasourceviewer.git

然后我cd进入并运行bootstrap.py:

cd lizard-datasourceviewer
python bootstrap.py

到目前为止,一切都很好。现在可以运行" bin/buildout",并且它将毫无麻烦地运行(嗯,在某个时候它出现了错误,因为系统没有matplotlib - 这是预期的结果)。但是不要那样做,因为一旦这样做,下面的错误就不会发生。如果这样做,请删除目录并再次克隆。

如果我不是从python运行的,则喜欢:

$ python
>>> import subprocess
>>> subprocess.call(["bin/buildout"])

然后,这会更早地失败(有关错误,请参见下文)。这是一个问题,因为我们想从脚本中调用BuiltOut。子过程呼叫的变化,例如OS.System(" bin/buildOut")或subprocess.call([["/bin/sh"," -c"," bin/buildOut"])无济于事。一旦bin/buildOut从命令行运行一次,即使再次调用了bootstrap.py,问题就消失了。

我知道什么时候出错。最初,bin/buildout看起来像这样:

#!/usr/bin/python
import sys
sys.path[0:0] = [
  '/usr/lib/python2.7/dist-packages',
  '/usr/lib/python2.7/dist-packages',
  '/usr/lib/python2.7/dist-packages',
  '/usr/lib/python2.7/dist-packages',
  '/usr/lib/python2.7/dist-packages',
  '/usr/lib/python2.7/dist-packages',
  '/usr/lib/python2.7/dist-packages',
  '/usr/lib/python2.7/dist-packages',
  '/usr/lib/python2.7/dist-packages',
  '/usr/lib/python2.7/dist-packages',
  '/usr/lib/python2.7/dist-packages',
  '/home/vagrant/lizard-datasourceviewer/eggs/zc.buildout-1.4.4-py2.7.egg',
  ]
import zc.buildout.buildout
if __name__ == '__main__':
    zc.buildout.buildout.main()

从命令行运行bin/buildOut后,它获得了"分布",重写bin/buildOut并重新启动自身。结果,垃圾箱/建筑物看起来像这样:

#!/usr/bin/python
import sys
sys.path[0:0] = [
  '/home/vagrant/lizard-datasourceviewer/eggs/zc.buildout-1.4.4-py2.7.egg',
  '/home/vagrant/lizard-datasourceviewer/eggs/distribute-0.6.27-py2.7.egg',
  ]
import zc.buildout.buildout
if __name__ == '__main__':
    zc.buildout.buildout.main()

是,当bin/buildOut从python而不是从外壳运行时,似乎失败了。错误消息是:

vagrant@precise64:~/lizard-datasourceviewer$ python
Python 2.7.3 (default, Apr 20 2012, 22:39:59) 
[GCC 4.6.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import subprocess
>>> subprocess.call(["bin/buildout"])
Getting distribution for 'mr.developer==1.21'.
Got mr.developer 1.21.
Getting distribution for 'buildout-versions==1.5'.
Got buildout-versions 1.5.
mr.developer: Creating missing sources dir /home/vagrant/lizard-datasourceviewer/src.
Getting distribution for 'distribute==0.6.27'.
Before install bootstrap.
Scanning installed packages
Setuptools installation detected at /usr/lib/python2.7/dist-packages
Non-egg installation
Removing elements out of the way...
Already patched.
/usr/lib/python2.7/dist-packages/setuptools.egg-info already patched.
After install bootstrap.
Don't have permissions to write /usr/local/lib/python2.7/dist-packages/setuptools-0.6c11-py2.7.egg-info, skipping
Creating /usr/local/lib/python2.7/dist-packages/setuptools-0.6c11-py2.7.egg-info
**error: /usr/local/lib/python2.7/dist-packages/setuptools-0.6c11-py2.7.egg-info: Permission denied**
An error occured when trying to install distribute 0.6.27. Look above this message for any errors that were output by easy_install.
While:
  Installing.
  Checking for upgrades.
  Getting distribution for 'distribute==0.6.27'.
Error: Couldn't install: distribute 0.6.27
1

如您所见,它正在尝试将其安装到该用户无法访问的系统Dist-backages中。但为什么?从外壳运行相同的脚本有什么区别?

不确定为什么,但是使用subprocess.call(['/bin/bash', '-c', 'bin/buildout'])似乎为我修复了subprocess.call(['/bin/sh', '-c', 'bin/buildout'])失败。Ubuntu 12.04。

希望它有帮助。:)

尝试使用可选参数shell=True

调用subprocess.call()

来自子进程文档:

如果Shell为True,则指定命令将通过 壳。如果您主要用于 增强了控制流量,它在大多数系统外壳上提供了 方便访问其他外壳功能,例如外壳管道, 文件名通配符,环境变量扩展和扩展〜 到用户的主目录。

最新更新