【问题标题】:Turn Django list of paths into PYTHONPATH将 Django 路径列表转换为 PYTHONPATH
【发布时间】:2012-08-03 01:50:43
【问题描述】:

我正在尝试为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。

【问题讨论】:

    标签: python django celery django-celery pythonpath


    【解决方案1】:

    好的,更简单的方法:

    export PYTHONPATH='/opt/app/current':`ls -d -1 /opt/app/current/eggs/* | tr '\n' ':'`
    

    【讨论】:

    • 很好,我不知道 tr。谢谢。
    【解决方案2】:

    我们正在研究的替代方法是将类似这样的内容添加到 buildout.cfg

     [python_wrapper]
     recipe = zc.recipe.egg
     eggs = ${buildout:eggs}
     interpreter = python
    

    并将python_wrapper 添加到parts 列表中。

    但是您在推特上发布的解决方法(将版本锁定到旧版本的 celery)更好。这是一个celery的bug,还是等开发者修复比较好。

    (所以我们还没有尝试过上面的解决方案,看看它是否真的有效......)

    【讨论】:

      猜你喜欢
      • 2015-07-02
      • 2016-06-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-06
      • 1970-01-01
      • 2019-10-01
      相关资源
      最近更新 更多