【问题标题】:PYTHONPATH issue on a Production server and Namespace challenge生产服务器和命名空间挑战上的 PYTHONPATH 问题
【发布时间】:2011-01-05 04:53:00
【问题描述】:

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

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

$ python2.5 manage.py syncdb
回溯(最近一次通话最后一次):
文件“manage.py”,第 11 行,在
执行管理器(设置)
文件“/home/app_name/webapps/app_name/lib/python2.5/django/core/management/init.py”,第 362 行,在 execute_manager
实用程序.execute()
文件“/home/app_name/webapps/app_name/lib/python2.5/django/core/management/init.py”,第 303 行,在执行
self.fetch_command(子命令).run_from_argv(self.argv)
文件“/home/app_name/webapps/app_name/lib/python2.5/django/core/management/base.py”,第 195 行,在 run_from_argv
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 行,在 validate
num_errors = get_validation_errors(s, app)
文件“/home/app_name/webapps/app_name/lib/python2.5/django/core/management/validation.py”,第 28 行,在 get_validation_errors
get_app_errors().items() 中的 (app_name, error):
文件“/home/app_name/webapps/app_name/lib/python2.5/django/db/models/loading.py”,第 131 行,在 get_app_errors
self._populate()
_populate
中的文件“/home/app_name/webapps/app_name/lib/python2.5/django/db/models/loading.py”,第 58 行 self.load_app(app_name, True)
文件“/home/app_name/webapps/app_name/lib/python2.5/django/db/models/loading.py”,第 74 行,在 load_app
模型 = import_module('.models', app_name)
文件“/home/app_name/webapps/app_name/lib/python2.5/django/utils/importlib.py”,第 35 行,在 import_module
import(名称)
文件“/home/app_name/webapps/app_name/django_app/../django_app/forum/models.py”,第 18 行,在
从 forum.managers 导入 *
文件“/home/app_name/webapps/app_name/django_app/forum/managers.py”,第 6 行,在
从 forum.models 导入 *
文件“/home/app_name/webapps/app_name/django_app/../django_app/forum/models.py”,第 43 行,在
类标签(models.Model):
文件“/home/app_name/webapps/app_name/django_app/../django_app/forum/models.py”,第 53 行,在 Tag
对象 = 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>  
>>>   

【问题讨论】:

  • 我尽量避免使用$PYTHONPATH,而使用virtualenvpip

标签: python django production pythonpath


【解决方案1】:

你的问题是你这样做:

从 forum.managers 导入 *(在第 18 行 models.py) from forum.models import *(第 6 行 manager.py)

这怎么可能奏效?尝试将其展平(通过手动复制和粘贴到新文件中进行导入),您会明白为什么,当它执行“objects = TagManager()”行时,它不可能执行管理器模块的部分其中定义了 TagManager,除非它是在第 18 行之前定义的。

一些一般提示:

  1. 尽可能避免 * 导入(这会使 Python 程序更难阅读)
  2. 如果您有这样的循环导入,请尝试分解它们。通常在一个模块中,您可以将导入移动到函数调用中,或者您可以将一些元素重构到第三个模块中,两者都可以从中导入。您也可以尝试在模块中将导入移到更低的位置,这有时会奏效。

【讨论】:

  • 我更改了导入以显式创建 Managers 命名空间。 Eveything 现在似乎可以工作了,但我想更清楚地说明为什么通配符 * 循环而显式名称不循环。
猜你喜欢
  • 2017-12-16
  • 2011-05-09
  • 1970-01-01
  • 2016-06-14
  • 2017-01-31
  • 2021-10-09
  • 1970-01-01
  • 2010-12-22
  • 2015-09-20
相关资源
最近更新 更多