私はこの問題の回避策を考え出そうとしています。
Chefを使用してアプリケーションをデプロイしていますが、現在PYTHONPATHが設定されていません。これは、独自のパスを設定するDjangoにとっては問題ありません。
$ cat bin/django
#!/usr/bin/python
import sys
sys.path[0:0] = [
'/opt/mytardis/releases/2737f42a91cd1b5d0a4b4c4609550fc586e351ab/eggs/nose-1.1.2-py2.7.egg',
'/opt/mytardis/releases/2737f42a91cd1b5d0a4b4c4609550fc586e351ab/eggs/coverage-3.4-py2.7-linux-x86_64.egg',
'/opt/mytardis/releases/2737f42a91cd1b5d0a4b4c4609550fc586e351ab/eggs/django_nose-1.1-py2.7.egg',
...
ただし、Celeryは「python」プロセスを直接起動し、モジュールが見つからないため失敗します。要約すれば:
$ python -c from billiard.forking import main
Traceback (most recent call last):
File "<string>", line 1, in <module>
ImportError: No module named billiard.forking
$ bin/django shell
>>> from billiard.forking import main
>>>
そのため、Djangoスクリプトで設定されたパスのリストをPythonで使用可能なPYTHONPATHに変換する必要があります。そして、この変換はスクリプト可能である必要があります(Chefであるため)。
これまでのところ、Awkを使用してスクリプトを巨大な「exportPYTHONPATH = ...」ステートメントに変換し、それを.bashrcに入れることしか考えられません。より良い方法があるに違いありませんか?
Python 2.7.3、Django1.4.1。