2012-12-20 29 views
3

tl,dr:我的buildouts可以在shell中使用“bin/buildout”,但在运行subprocess.call时失败([“bin/buildout”]] )或类似的Python。为什么?任何解决方法?使用subprocess.call()运行bin/buildout失败

我已经加入了“蟒蛇”的标签,而不是仅仅“扩建”,因为这可能是在使用subprocess.call调用从外壳python脚本VS蟒蛇一个微妙的差异()或使用os.system()。我不知道他们为什么会有所不同。这可能是一个建设性的事情,因为建设重写自己然后重新启动自己。

为了构建我想展示的例子,我从一个新的Ubuntu 12.04 LTS虚拟框开始。然后,我在其上安装的git(命令和apt-get安装GIT)和克隆我们的资料库中的一个已经在它几乎没有什么:

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

然后我进入这个目录并运行bootstrap.py:

cd lizard-datasourceviewer 
python bootstrap.py 

到目前为止,这么好。现在可以运行“bin/buildout”,并且它可以毫无麻烦地运行(当然,由于系统没有matplotlib,这是预期的结果)。但不要这样做,因为一旦你这样做,下面的错误将不会发生。如果你这样做,删除目录并再次克隆。

如果是相反,我从Python中运行,如:

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

那么这个失败早得多(见下文)中的错误。这是一个问题,因为我们想从脚本调用buildout。子进程调用的变体,如os.system(“bin/buildout”)或subprocess.call([“/ bin/sh”,“-c”,“bin/buildout”))不起作用。 一旦bin/buildout从命令行运行一次,问题就会消失,即使再次调用bootstrap.py。

我知道什么时候出问题了。最初,斌/扩建看起来是这样的:

#!/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() 

而且在命令行中运行斌/扩建后,它就会被“分配”,改写斌/扩建,并重新启动。结果斌/扩建看起来是这样的:

#!/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() 

正是这种重写和重新启动的步骤,似乎当斌/扩建从Python的,而不是从shell运行失败。错误信息如下:

[email protected]:~/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-packages中,此用户无权访问。但为什么?从shell运行相同的脚本有什么不同?

回答

2

不知道为什么,但使用subprocess.call(['/bin/bash', '-c', 'bin/buildout'])似乎为我解决它,其中subprocess.call(['/bin/sh', '-c', 'bin/buildout'])失败。 Ubuntu 12.04。

希望它有帮助。 :)

+0

然后设置'shell = True',它会使用你的默认shell。 –

+1

@MartijnPieters nope,除了Windows以外的任何其他操作'subprocess.call(shell_code,shell = True)'与传递'subprocess.call(['/ bin/sh','-c',shell_code]')相同。 '。它不会为您的用户使用默认的登录shell。 – monk

+0

有趣;因此'distribute'安装需要'bash'。 –

0

尝试使用可选参数shell=True调用subprocess.call()

subprocess documentation

如果壳为True,则指定命令将通过 壳执行。如果您主要将Python用于其在大多数系统shell中提供的增强控制流,并且仍然希望 可以方便地访问其他shell功能,如shell管道, 文件名通配符,环境变量扩展和〜 的扩展到用户的主目录。

+0

我试过这个(subprocess.call([“bin/buildout”],shell = True)),但它没有帮助。同样的错误。 – RemcoGerlich