Django 在project中导入芹菜失败,在manage.py shell中工作(有点)

Django 在project中导入芹菜失败,在manage.py shell中工作(有点),django,celery,django-celery,Django,Celery,Django Celery,我正在查看此列表,但无法使其正常工作: 所以我所做的是: 1) 下载芹菜模块并将其添加到my manage.py和wsgi.py: # -*- coding: utf-8 -*- #!/usr/bin/env python import os, sys from ConfigParser import RawConfigParser config = RawConfigParser() abspath = os.path.abspath(os.path.dirname(__file__))

我正在查看此列表,但无法使其正常工作:

所以我所做的是: 1) 下载芹菜模块并将其添加到my manage.py和wsgi.py:

# -*- coding: utf-8 -*-
#!/usr/bin/env python
import os, sys
from ConfigParser import RawConfigParser

config = RawConfigParser()
abspath = os.path.abspath(os.path.dirname(__file__))

config.read(abspath+'/subfolder/settings.ini')

homedir = config.get('paths', 'libspath')
projectspath = config.get('paths', 'projectspath')

path = [
    '/Django-1.4.5/', 
    '/South-0.7.6',
    '/python-openid-master',#07.05.2013 checkout from https://github.com/openid/python-openid
    '/mbi-django-rosetta-eca151e',
    '/phonenumbers-5.2b1',
    '/django-phonenumber-field-develop',
    '/django-openid-auth-0.5',
    '/celery-3.0.19',
    '/django-celery-3.0.17',
    '/kombu-2.5.11',
    '/billiard-2.7.3.28',
    '/anyjson-0.3.3',
    '/amqp-1.0.12'
    ]

for item in path:
    module = homedir+item
    if module not in sys.path:
        sys.path.append(module)
2) 已安装rabbitmq 3) 在settings.py中设置内容:

INSTALLED_APPS = (
    ---
    'djcelery',
)
最后:

BROKER_URL = 'amqp://guest:guest@localhost:5672/'
import djcelery
djcelery.setup_loader()
4) 运行python manage.py syncdb

5) 由于im使用mod_wsgi,我也将其添加到了我的wsgi.py中(除了我前面显示的代码)

6) 我在我的核心应用程序中创建了tasks.py:

import logging, subprocess
logger = logging.getLogger('debugger')

from django.conf import settings

from celery import task

@task
def runfunc(funcname, refno):
    x = 'nothing to see here'
7) 我运行:python manage.py芹菜工人--loglevel=info 得到一大堆的东西意味着一切都好:P

但当我转到django视图时,它应该运行我得到的任务:

cannot import name task
Request Method: GET
Request URL:    http://localhost/url/that/triggers/task/
Django Version: 1.4.5
Exception Type: ImportError
Exception Value:    
cannot import name task
Exception Location: /path/to/project/core/tasks.py in <module>, line 6
无法导入名称任务
请求方法:获取
请求URL:http://localhost/url/that/triggers/task/
Django版本:1.4.5
异常类型:ImportError
异常值:
无法导入名称任务
异常位置:/path/to/project/core/tasks.py in,第6行
当我转到manage.py shell并键入 从芹菜进口任务-它的工作刚刚好。 如果我从core.tasks导入函数,则会得到完全相同的错误消息

谁能给我解释一下上面是什么


Alan

尝试将tasks.py更改为:

from __future__ import absolute_import
from celery import task

您可能有一个
芹菜/
芹菜.py
与抛出错误的模块(
tasks.py
)位于同一目录中,这是一个相对导入失败的情况。

Yikes,您第一步是从哪里得到这些信息的??我从来没有改变过
manage.py
wsgi.py
文件来运行额外的包。你说“下载的芹菜模块”,然后你就有了所有的
sys.path
转换代码。这让我相信您没有使用
pip
virtualenv
。使用这两种工具,你的生活将变得更加轻松。你会简化很多事情,你的团队会永远爱你。当Python包管理存在时,不要过度复杂化,以使其不受痛苦的影响。路径损坏很少是必要的

你所提到的就是你所需要的一切。看起来您已经处理了这个特殊的
mod\wsgi
note。我想问题在于第一步——不管您对manage.py和wsgi.py做了什么修改。所有其他步骤看起来都很好*

我会复制你的代码,制作一个新的virtualenv,pip安装这些软件包并删除所有路径设置的东西。使用
django-admin.py启动项目xxx
查看普通
manage.py
wsgi.py
文件的外观。还可以使用
DEBUG=True
帮助进行故障排除。当这起作用并解决问题后,用pip替换
设置.ini


*您使用South,所以请记住
python manage.py migrate djcellery
。(在步骤4中,您仅使用
syncdb
)。我不相信这样做会修复导入错误,但从大局来看这是必要的。

django视图真的在django中运行吗?这不是一个静态页面吗?设置模块是否已加载?(
来自django.conf import settings
)是的,它正在通过django运行,设置模块也在那里加载。如果您查看第6点),您可以看到设置在那里加载。是的,我看到了,但在任务模块中。它是否也加载到视图中?我不熟悉芹菜作为django应用程序,因此它可能是一个自动视图。在“从管理运行”和“从视图运行”案例中,您是否也可以从manage.py打印“abspath”和“sys.path”?我怀疑您有一些python路径问题。第一部分看起来有点像生成文件的构建类型。我当然希望是……不。既不使用pip也不使用virtualenv。我发现更新manage.py和wsgi.py要比仅仅为了测试某些django模块/代码片段的不同版本而更新(或创建新的)虚拟环境容易得多。因此,我将使用不同的虚拟环境来代替版本化文件,这确实解决了这个问题。在检查了我头脑中的文件夹和项目以查找芹菜的文件夹和文件后(什么也没有找到),我记得我首先创建了名为芹菜.py的文件,后来出于完全相同的原因将其重命名为tasks.py。但是我忘了删除.pyc文件。造成了这一切混乱的原因:/
from __future__ import absolute_import
from celery import task