Проблема с PYTHONPATH на рабочем сервере и вызовом пространства имен

StackOverflow https://stackoverflow.com/questions/2066426

Вопрос

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

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

управление $ python2.5.py syncdb
Обратная трассировка (последний последний вызов):
Файл "manage.py", строка 11, в
execute_manager(настройки)
Файл "/home/имя_приложения/webapps/имя_приложения/библиотека/python2.5/django/ядро/управление/инициализация.py", строка 362, в execute_manager
утилита.execute()
Файл "/home/имя_приложения/webapps/имя_приложения/библиотека/python2.5/django/ядро/управление/инициализация.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(*аргументы, **параметры.диктовать)
Файл "/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(ы, приложение)
Файл "/home/app_name/webapps/app_name/lib/python2.5/django/core/management/validation.py", строка 28, в get_validation_errors
для (app_name, ошибка) в get_app_errors().items():
Файл "/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, в _populate
self.load_app(имя_приложения, 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, в
с форума.импорт моделей *
Файл "/home/app_name/webapps/app_name/django_app/../django_app/forum/models.py", строка 43, в
тег класса (модели.Модель):
Файл "/home/app_name/webapps/app_name/django_app/../django_app/forum/models.py", строка 53, в теге
объекты = TagManager()
Ошибка имени:имя "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>  
>>>   
Это было полезно?

Решение

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

импорт с форума.менеджеры * (в строке 18 models.py) импорт с форума.модели * (в строке 6 managers.py)

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

Несколько общих советов:

  1. По возможности избегайте импорта * (это затрудняет чтение программ на python, если не что иное).
  2. Если у вас есть подобный циклический импорт, попробуйте разбить его на части.Часто в одном модуле вы можете перенести импорт в вызов функции или провести рефакторинг некоторых элементов в третьем модуле, из которого оба могут импортировать.Вы также можете попробовать переместить импорт ниже в модуле, что иногда срабатывает.
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top