0


0

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

Меня действительно смущают некоторые ошибки, которые я получаю, пытаясь запустить приложение в производство. На машине разработки все работает нормально, но я не могу синхронизировать или войти в оболочку 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 ()" /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, в файле 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 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) File "/ home / app_name / webapps /app_name/lib/python2.5/django/db/models/loading.py ", строка 74, в файле load_app models = import_module ('. models', имя_приложения)" / home / имя_приложения / webapps / имя_приложения / lib / python2 .5 / django / utils / importlib.py ", строка 35, в файле import_module * import * (name)" "/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 / имя_приложения / webapps / имя_приложения / 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 "", line 1, in
  File "/home/app_name/webapps/app_name/django_app/forum/managers.py", line 6, in
    from forum.models import *
  File "/home/app_name/webapps/app_name/django_app/../django_app/forum/models.py", line 43, in
    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

>>>

1 Answer


1


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

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

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

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

  1. По возможности избегайте * импорта (это усложняет программы на Python читать если не что иное)

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