2016-12-29 48 views
0

我的文件夹结构憋屈芹菜教程

proj/ 
    __init__.py 
    celery_app.py 
    tasks.py 

我celery_app看起来像

from __future__ import absolute_import, unicode_literals 
from celery import Celery 

app = Celery('proj', 
      broker='amqp://', 
      backend='amqp://', 
      include=['proj.tasks']) 

# Optional configuration, see the application user guide. 
app.conf.update(
    result_expires=3600, 
) 

if __name__ == '__main__': 
    app.start() 

和我tasks.py看起来像

from __future__ import absolute_import, unicode_literals 
from celery_app import app 

@app.task 
def add(x, y): 
    return x + y 

@app.task 
def mul(x, y): 
    return x * y 

@app.task 
def xsum(numbers): 
    return sum(numbers) 

当我去命令行并运行

celery -A proj worker --app=proj.celery_app:app -l info

我得到一个错误

"ImportError: No module named celery_app"

,当我打开它从

from celery_app import app

from .celery_app import app

然后它的作品!但后来,当我尝试从任务中导入*从蟒蛇的外壳,我得到

ValueError: Attempted relative import in non-package

不过,如果我回去,并带走之前。在celery_app的前面,我可以成功导入它。为什么会发生这种情况,我需要改变我为每个脚本导入它以便成功运行?

回答

1

使用绝对导入绝对是做正确的事。所以,你应该使用这个import语句

from .celery_app import app 

为了解决运行问题不断尝试在交互式的Python会话导入时进入,你应该在包含proj,然后在同一目录下启动会话这样做:

from proj.tasks import * 

我复制你的代码,我的机器,并做了我认为上面,它工作得很好。

+0

由于某种原因,它不适合我......你认为这与使用2.7解释器有关吗? – joe

+0

我正在使用2.7。确保你完全按照我的指示。可能有助于在新目录中从头开始,以防出现干扰。如果有帮助,我在回答中改进了格式。 – Louis

+0

没关系让它工作,谢谢。 – joe

-1

您可以尝试在$ PYTHONPATH变量中添加路径。

0

运行这些命令:

cd proj 
celery -A proj worker --app=celery_app:app -l info 

要正确运行Python脚本,你必须在该脚本文件夹中。这就是为什么你得到这个错误

ImportError: No module named celery_app