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

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

Я думаю, что это может быть проблема PYTHONPATH, но в ней есть странный аспект курицы или яйца. Я не понимаю, почему TagManager отсутствует в NameSpace.
TagManager импортируется через:
из forum.managers import *
Это выполняется до вызова класса 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 ()
File" / 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, в проверке
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
для (app_name, error) в get_app_errors (). items ():
File" /home/app_name/webapps/app_name/lib/python2.5/django/db/models/loading.py ", строка 131, в get_app_errors
self._populate ()
File" / home / app_name / webapps /app_name/lib/python2.5/django/db/models/loading.py ", строка 58, в _populate
self.load_app (app_name, True)
File" / home / app_name / webapps / app_name / lib / python2.5 / django / db / models / loading.py ", строка 74, в load_app
models = import_module ('. models', app_name)
File" / home / app_name / webapps / app_name / lib / python2.5 / django / utils / importlib.py ", строка 35, в import_module
import (name)
File" / 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, в
теге класса (models.Model):
Файл "/home/app_name/webapps/app_name/django_app/../django_app/forum/models.py", строка 53, в Tag
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>  
>>>   

person BryanWheelock    schedule 14.01.2010    source источник
comment
Я стараюсь избегать $PYTHONPATH в пользу virtualenv и pip   -  person notnoop    schedule 14.01.2010


Ответы (1)


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

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

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

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

  1. По возможности избегайте импорта * (это затрудняет чтение программ на Python, если ничего больше)
  2. Если у вас есть такой циклический импорт, попробуйте разбить его. Часто в одном модуле вы можете переместить импорт в вызов функции или выполнить рефакторинг некоторых элементов в третий модуль, из которого оба могут импортировать. Вы также можете попробовать переместить импорт ниже в модуле, что иногда срабатывает.
person Eloff    schedule 14.01.2010
comment
Я изменил импорт, чтобы явно создать пространство имен Managers. Кажется, сейчас все работает, но я хотел бы больше пояснений, почему подстановочный знак * зациклен, а явные имена - нет. - person BryanWheelock; 15.01.2010