2013-07-30 41 views
1

我正在尝试将django-芹菜集成到现有的网站中,并且我遇到了一个我似乎无法修复的错误。尝试运行django-芹菜工作进程时生成的ImportError

对于上下文,我通过了Django first steps并且测试项目成功了,也就是说一切都按照它应该的那样工作。现在

,在我现有的项目,我不能在命令行运行芹菜工作人员:

manage.py celery worker --loglevel=info --settings=myproject.settings.dev_settings 

当我跑,我得到了下面的堆栈跟踪和错误:

Traceback (most recent call last): 
    File "C:\sites\corecrm\manage.py", line 10, in <module> 
    execute_from_command_line(sys.argv) 
    File "C:\Python27\lib\site-packages\django\core\management\__init__.py", line 453, in execute_from_command_line 
    utility.execute() 
    File "C:\Python27\lib\site-packages\django\core\management\__init__.py", line 392, in execute 
    self.fetch_command(subcommand).run_from_argv(self.argv) 
    File "C:\Python27\lib\site-packages\djcelery\management\commands\celery.py", line 22, in run_from_argv 
    ['%s %s' % (argv[0], argv[1])] + argv[2:], 
    File "C:\Python27\lib\site-packages\celery\bin\celery.py", line 901, in execute_from_commandline 
    super(CeleryCommand, self).execute_from_commandline(argv))) 
    File "C:\Python27\lib\site-packages\celery\bin\base.py", line 187, in execute_from_commandline 
    return self.handle_argv(prog_name, argv[1:]) 
    File "C:\Python27\lib\site-packages\celery\bin\celery.py", line 893, in handle_argv 
    return self.execute(command, argv) 
    File "C:\Python27\lib\site-packages\celery\bin\celery.py", line 868, in execute 
    return cls(app=self.app).run_from_argv(self.prog_name, argv) 
    File "C:\Python27\lib\site-packages\celery\bin\celery.py", line 148, in run_from_argv 
    return self(*args, **options) 
    File "C:\Python27\lib\site-packages\celery\bin\celery.py", line 118, in __call__ 
    ret = self.run(*args, **kwargs) 
    File "C:\Python27\lib\site-packages\celery\bin\celery.py", line 220, in run 
    return self.target.run(*args, **kwargs) 
    File "C:\Python27\lib\site-packages\celery\bin\celeryd.py", line 153, in run 
    return self.app.Worker(**kwargs).run() 
    File "C:\Python27\lib\site-packages\celery\apps\worker.py", line 162, in run 
    self.app.loader.init_worker() 
    File "C:\Python27\lib\site-packages\celery\loaders\base.py", line 130, in init_worker 
    self.import_default_modules() 
    File "C:\Python27\lib\site-packages\djcelery\loaders.py", line 138, in import_default_modules 
    self.autodiscover() 
    File "C:\Python27\lib\site-packages\djcelery\loaders.py", line 141, in autodiscover 
    self.task_modules.update(mod.__name__ for mod in autodiscover() or()) 
    File "C:\Python27\lib\site-packages\djcelery\loaders.py", line 176, in autodiscover 
    for app in settings.INSTALLED_APPS]) 
    File "C:\Python27\lib\site-packages\djcelery\loaders.py", line 195, in find_related_module 
    return importlib.import_module('%s.%s' % (app, related_name)) 
    File "C:\Python27\lib\importlib\__init__.py", line 37, in import_module 
    __import__(name) 
    File "C:\sites\corecrm\people\tasks.py", line 15, in <module> 
    from people.models import Customer, CustomerCsvFile, CustomerToTag, get_customer_from_csv_row 
    File "C:\sites\corecrm\people\models.py", line 163, in <module> 
    UserProfile._meta.get_field_by_name('username')[0]._max_length = 75 
    File "C:\Python27\lib\site-packages\django\db\models\options.py", line 351, in get_field_by_name 
    cache = self.init_name_map() 
    File "C:\Python27\lib\site-packages\django\db\models\options.py", line 380, in init_name_map 
    for f, model in self.get_all_related_m2m_objects_with_model(): 
    File "C:\Python27\lib\site-packages\django\db\models\options.py", line 469, in get_all_related_m2m_objects_with_model 
    cache = self._fill_related_many_to_many_cache() 
    File "C:\Python27\lib\site-packages\django\db\models\options.py", line 483, in _fill_related_many_to_many_cache 
    for klass in get_models(only_installed=False): 
    File "C:\Python27\lib\site-packages\django\db\models\loading.py", line 197, in get_models 
    self._populate() 
    File "C:\Python27\lib\site-packages\django\db\models\loading.py", line 75, in _populate 
    self.load_app(app_name) 
    File "C:\Python27\lib\site-packages\django\db\models\loading.py", line 96, in load_app 
    models = import_module('.models', app_name) 
    File "C:\Python27\lib\site-packages\django\utils\importlib.py", line 35, in import_module 
    __import__(name) 
    File "C:\sites\corecrm\booking\models.py", line 17, in <module> 
    from people.models import Customer, UserProfile 
ImportError: cannot import name Customer 

要尝试找出预订/ models.py脚本看到了什么的人加入我在开始执行以下操作:

import people 
print 'path: %s' % people.__path__ 
for item in dir(people): 
    print item 

这给了我下面的输出:

path: ['C:\\sites\\corecrm\\people'] 
__builtins__ 
__doc__ 
__file__ 
__name__ 
__package__ 
__path__ 
path: ['C:\\sites\\corecrm\\people'] 
__builtins__ 
__doc__ 
__file__ 
__name__ 
__package__ 
__path__ 
然而

,当我运行manage.py shell --settings=myproject.settings.dev_settings我得到以下的输出:

path: ['C:\\sites\\corecrm\\people'] 
__builtins__ 
__doc__ 
__file__ 
__name__ 
__package__ 
__path__ 
path: ['C:\\sites\\corecrm\\people'] 
__builtins__ 
__doc__ 
__file__ 
__name__ 
__package__ 
__path__ 
models 

正如你可以看到models模块可在的结束shell命令的第二个列表(我已经证实这也是对于芹菜以外的manage.py命令的情况)。当我运行celery命令时,如何确保该模块在同一点上可用?

编辑:我现在还在Ubuntu VM上设置了这个项目,当我尝试运行worker管理命令时出现同样的错误。有任何想法吗?任何人?

ANOTHER编辑:我已经贴订票/ models.py和人/ models.py代码在http://pastebin.com/fTVVBtB4

+0

Aren'you失踪“__init__.py”(init之前和之后的双下划线)文件在people /目录中告诉Python它是一个包? – Ricola3D

+0

如果没有'__init __。py',它就根本不存在__init __。py' – Glycerine

+0

@ Ricola3D:不,'__init __。py'文件存在,否则尝试运行shell管理命令(或任何其他命令)将不起作用。另外,人员应用程序是使用'manage.py startapp people'创建的,它可以自动将'__init __。py'放入目录 – hellsgate

回答

1

我敢肯定,这条线是你的问题:

File "C:\sites\corecrm\people\models.py", line 163, in <module> 
    UserProfile._meta.get_field_by_name('username')[0]._max_length = 75 

虽然您仍然忙于从people.models导入,此行(特别是get_field_by_name)强制Django评估模型并设置该模型与其相关模型之间的所有关系。这反过来又会强制在people.models中输入Customer,而您仍然忙于导入该确切模型。这是ImportError的结果。

对于工作解决方案,您需要发布models.py。

为什么这个错误只发生在芹菜?我不能肯定地说没有更多的信息,但我最好的猜测是,芹菜处理导入一切略有不同(Django可能不会一次导入Customer,CustomerCsvFile,CustomerToTagget_customer_from_csv_row),并且这暴露了您的错误码。

编辑/解决方案:
我会删除此行:

UserProfile._meta.get_field_by_name('username')[0]._max_length = 75 

,并将其移动到实例的层次,进入__init__方法:

class UserProfile(AbstractUser): 
    def __init__(self, *args, **kwargs): 
     self._meta.get_field_by_name('username')[0]._max_length = 75 
     super(UserProfile, self).__init__(*args, **kwargs) 

如果该问题的原因是实际上我认为它是这样的,这将在提供相同功能的同时修复循环导入。如果MAX_LENGTH功能得到打破以某种方式(最有可能是因为内部一个MAX_LENGTH校验器被添加到CharField和_max_length改变太晚了)我想,而不是覆盖在init方法的完整username领域:

class UserProfile(AbstractUser): 
    def __init__(self, *args, **kwargs): 
     super(UserProfile, self).__init__(*args, **kwargs) 
     self._meta.get_field_by_name('username')[0] = models.CharField(max_length=75, etc.) 
+0

我已经发布了一个代码链接,而不是将其添加到这个问题因为它相当大 – hellsgate

+0

@hellsgate我已经用解决方案更新了我的答案。 – knbk

+0

完美,工人现在按预期运行。谢谢! – hellsgate