我正在尝试为this problem提供解决方法。
我正在使用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将脚本变成一个巨大的“export PYTHONPATH = ...”语句并将其放在.bashrc中。肯定有更好的办法?
Python 2.7.3,Django 1.4.1。
答案 0 :(得分:1)
好的,更简单的方法:
export PYTHONPATH='/opt/app/current':`ls -d -1 /opt/app/current/eggs/* | tr '\n' ':'`
答案 1 :(得分:1)
我们正在考虑的另一种方法是将这样的内容添加到buildout.cfg
[python_wrapper]
recipe = zc.recipe.egg
eggs = ${buildout:eggs}
interpreter = python
并将python_wrapper
添加到parts
列表。
但是你推文的解决方法(版本锁定到旧版芹菜)更好。这是一个芹菜错误,最好等待开发人员修复它。
(所以我们没有尝试过上面的解决方案,看看它是否真的有效......)