生产服务器和命名空间挑战上的PYTHONPATH问题

时间:2010-01-14 18:16:58

标签: python django production pythonpath

我真的很困惑我正在尝试将应用程序投入生产时遇到的一些错误。在开发机器上一切正常,但我无法syncdb或在生产服务器上输入Django shell。 当forum.models.py尝试导入forum.managers.py时,我收到错误,因为模型还没有在命名空间中。

我认为它可能是一个PYTHONPATH问题,但它有一个奇怪的鸡肉或鸡蛋方面。我不明白为什么TagManager不在NameSpace中 TagManager通过以下方式导入:
来自forum.managers import *
这是在调用TagManager类之前执行的。

$ python2.5 manage.py syncdb
追溯(最近的呼叫最后):
  文件“manage.py”,第11行,中     execute_manager(设置)
  文件“/home/app_name/webapps/app_name/lib/python2.5/django/core/management/init.py”,第362行,在execute_manager中     utility.execute()
  文件“/home/app_name/webapps/app_name/lib/python2.5/django/core/management/init.py”,第303行,执行中
    self.fetch_command(子命令).run_from_argv(self.argv)
  在run_from_argv中输入文件“/home/app_name/webapps/app_name/lib/python2.5/django/core/management/base.py”,第195行     self.execute(* args,** options。 dict
  文件“/home/app_name/webapps/app_name/lib/python2.5/django/core/management/base.py”,第221行,执行中
    self.validate()
  文件“/home/app_name/webapps/app_name/lib/python2.5/django/core/management/base.py”,第249行,在验证中     num_errors = get_validation_errors(s,app)
  在get_validation_errors中输入文件“/home/app_name/webapps/app_name/lib/python2.5/django/core/management/validation.py”,第28行     for(app_name,error)in get_app_errors()。items():
  在get_app_errors中输入文件“/home/app_name/webapps/app_name/lib/python2.5/django/db/models/loading.py”,第131行     self._populate()
  文件“/home/app_name/webapps/app_name/lib/python2.5/django/db/models/loading.py”,第58行,在_populate中     self.load_app(app_name,True)
  文件“/home/app_name/webapps/app_name/lib/python2.5/django/db/models/loading.py”,第74行,在load_app中     models = import_module('。models',app_name)
  在import_module中输入文件“/home/app_name/webapps/app_name/lib/python2.5/django/utils/importlib.py”,第35行     导入(名称)
  文件“/home/app_name/webapps/app_name/django_app/../django_app/forum/models.py”,第18行,中
    来自forum.managers import *
  文件“/home/app_name/webapps/app_name/django_app/forum/managers.py”,第6行,中
    来自forum.models import *
  文件“/home/app_name/webapps/app_name/django_app/../django_app/forum/models.py”,第43行,中
    class Tag(models.Model):
  文件“/home/app_name/webapps/app_name/django_app/../django_app/forum/models.py”,第53行,在标签中     objects = TagManager()
NameError:名称'TagManager'未定义

Python 2.5.4 (r254:67916, Aug  5 2009, 12:42:40)   
[GCC 4.1.2 20080704 (Red Hat 4.1.2-44)] on linux2  
Type "help", "copyright", "credits" or "license" for more information.  
>>> import os  
>>> os.environ['DJANGO_SETTINGS_MODULE'] = 'django_app.settings'  
>>>   
>>> import sys  
>>> import pprint  
>>> pprint.pprint(sys.path)  
['',  
 '/home/app_name/webapps/app_name/lib/python2.5',  
 '/home/app_name/lib/python2.5/markdown2-1.0.1.16-py2.5.egg',  
 '/home/app_name/lib/python2.5/html5lib-0.11.1-py2.5.egg',  
 '/home/app_name/lib/python2.5',  
 '/usr/local/lib/python25.zip',  
 '/usr/local/lib/python2.5',  
 '/usr/local/lib/python2.5/plat-linux2',  
 '/usr/local/lib/python2.5/lib-tk',  
 '/usr/local/lib/python2.5/lib-dynload',  
 '/usr/local/lib/python2.5/site-packages',  
 '/usr/local/lib/python2.5/site-packages/PIL']  
>>> sys.path = ['/home/app_name/webapps/app_name/django_app','/home/app_name/webapps/app_name','/home/app_name/webapps/app_name/lib/python2.5'] + sys.path  
>>> pprint.pprint(sys.path)['/home/app_name/webapps/app_name/django_app',  
 '/home/app_name/webapps/app_name',  
 '/home/app_name/webapps/app_name/lib/python2.5',  
 '',  
 '/home/app_name/webapps/app_name/lib/python2.5',  
 '/home/app_name/lib/python2.5/markdown2-1.0.1.16-py2.5.egg',  
 '/home/app_name/lib/python2.5/html5lib-0.11.1-py2.5.egg',  
 '/home/app_name/lib/python2.5',  
 '/usr/local/lib/python25.zip',  
 '/usr/local/lib/python2.5',  
 '/usr/local/lib/python2.5/plat-linux2',  
 '/usr/local/lib/python2.5/lib-tk',  
 '/usr/local/lib/python2.5/lib-dynload',  
 '/usr/local/lib/python2.5/site-packages',  
 '/usr/local/lib/python2.5/site-packages/PIL']  
>>> from forum.managers import *  
Traceback (most recent call last):  
  File "<stdin>", line 1, in <module>  
  File "/home/app_name/webapps/app_name/django_app/forum/managers.py", line 6, in <module>  
    from forum.models import *  
  File "/home/app_name/webapps/app_name/django_app/../django_app/forum/models.py", line 43, in <module>  
    class Tag(models.Model):  
  File "/home/app_name/webapps/app_name/django_app/../django_app/forum/models.py", line 53, in Tag  
    objects = TagManager()  
NameError: name 'TagManager' is not defined  
>>> from forum.models import *  
>>> from forum.managers import *  
>>> objects = TagManager()  
>>> objects  
<forum.managers.TagManager object at 0x9b9fdac>  
>>>   

1 个答案:

答案 0 :(得分:1)

你的问题是:

来自forum.managers import *(第18行models.py) 来自forum.models import *(第6行MANAG.py)

这怎么可能有用?尝试将其展平(手动复制并粘贴到新文件中),你会看到为什么,当它执行“objects = TagManager()”行时,它不可能执行管理器模块的一部分其中定义了TagManager,除非它是在第18行之前定义的。

一些一般提示:

  1. 尽可能避免使用*导入(如果没有别的话,它会让python程序更难阅读)
  2. 如果您有这样的循环导入,请尝试将其分解。通常在一个模块中,您可以将导入移动到函数调用中,或者您可以将一些元素重构为可以从中导入的第三个模块。您也可以尝试在模块中移动较低的导入,这有时可以正常工作。