Проблема PYTHONPATH на производственном сервере и проблема пространства имен - PullRequest
0 голосов
/ 14 января 2010

Меня действительно смущают некоторые ошибки, которые я получаю, пытаясь запустить приложение в производство. На компьютере разработчика все работает нормально, но я не могу синхронизировать или войти в оболочку Django на производственном сервере. Я получаю сообщение об ошибке, когда forum.models.py пытается импортировать forum.managers.py, потому что модели еще не находятся в пространстве имен.

Я думаю, это может быть проблема PYTHONPATH, но в ней есть странный аспект с курицей или яйцом. Я не понимаю, почему TagManager отсутствует в пространстве имен.
TagManager импортируется через:
с форума. Менеджеры импорта *
Который выполняется до вызова класса TagManager.

$ python2.5 manage.py syncdb
Traceback (последний вызов был последним):
Файл "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, в файле execute
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, в файле execute
self.validate ()
Файл "/home/app_name/webapps/app_name/lib/python2.5/django/core/management/base.py", строка 249, в проверке
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
for (имя_приложения, ошибка) в get_app_errors (). items ():
Файл "/home/app_name/webapps/app_name/lib/python2.5/django/db/models/loading.py", строка 131, в get_app_errors
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', имя_приложения)
Файл "/home/app_name/webapps/app_name/lib/python2.5/django/utils/importlib.py", строка 35, в файле import_module
импорт (имя)
Файл "/home/app_name/webapps/app_name/django_app/../django_app/forum/models.py", строка 18, в
с форума. Менеджеры импорта *
Файл "/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, в
Тег класса (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 Ответ

1 голос
/ 14 января 2010

Ваша проблема в том, что вы делаете:

из импорта forum.managers * (в строке 18 models.py) из forum.models import * (в строке 6 manager.py)

Как это может работать? Попробуйте сгладить это (выполнить импорт вручную, скопировав и вставив в новый файл), и вы поймете, почему к тому времени, когда он выполняет строку «objects = TagManager ()», он не может выполнить часть модуля Manager. где TagManager определен, если он не был определен перед строкой 18.

Некоторые общие советы:

  1. По возможности избегайте * импорта (это затрудняет чтение программ на Python, если ничего не происходит)
  2. Если у вас есть такие циклические импорта, попробуйте разбить их. Часто в одном модуле вы можете переместить импорт в вызов функции или вы можете выполнить рефакторинг некоторых элементов в третий модуль, из которого оба могут импортировать. Вы также можете попробовать переместить импорт ниже в модуле, который иногда работает.
...