tl,dr: シェルから "bin/buildout" を使用すると正常に動作するビルドアウトがありますが、Python から subprocess.call(["bin/buildout"]) などを実行すると失敗します。なんで?回避策はありますか?
「buildout」の代わりに「python」タグを追加しました。これは、シェルから Python スクリプトを呼び出す場合と、subprocess.call() または os.system() を使用して Python から呼び出す場合の微妙な違いである可能性があるためです。なぜ違うのかわかりません。Buildoutは自分自身を書き換えてから再起動するため、おそらくBuildoutの問題です。
表示する例を作成するには、新しい Ubuntu 12.04 LTS 仮想ボックスから始めます。次に、git をインストールし (sudo apt-get install git)、ほとんど何も入っていないリポジトリの 1 つを複製します。
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"])
その後、これははるかに早く失敗します (エラーについては以下を参照してください)。buildout をスクリプトから呼び出したいので、これは問題です。os.system("bin/buildout") や subprocess.call(["/bin/sh", "-c", "bin/buildout"]) のようなサブプロセス呼び出しのバリエーションは役に立ちません。bin/buildout がコマンド ラインから 1 回実行されると、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 を実行すると、「distribute」になり、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()
シェルからではなく Python から bin/buildout を実行すると失敗するように見えるのは、この書き換えと再起動の手順です。エラーメッセージは次のとおりです。
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-packages にインストールしようとしています。しかし、なぜ?シェルから同じスクリプトを実行する場合との違いは何ですか?