0


0

実稼働サーバーとネームスペースチャレンジでのPYTHONPATHの問題

アプリを本番環境にしようとしているときに発生するいくつかのエラーに本当に混乱しています。 開発マシンではすべてが正常に動作しますが、syncdbを実行したり、実稼働サーバーでDjangoシェルに入ることはできません。 モデルがまだネームスペースにないため、forum.models.pyがforum.managers.pyをインポートしようとするとエラーが発生します。

それはPYTHONPATHの問題かもしれないが、それは奇妙なチキンまたはエッグの側面を持っています。 TagManagerがNameSpaceにない理由がわかりません。 + TagManagerは次の方法でインポートされます:+ forum.managers importから* + TagManagerクラスが呼び出される前に実行されます。

$ python2.5 manage.py syncdb トレースバック(最後の最後の呼び出し):+ファイル「manage.py」、11行目、 execute_manager(settings)ファイル「/ 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行目、execute + self.fetch_command(subcommand).run_from_argv(self.argv)+ File" /home/app_name/webapps/app_name/lib/python2.5/django/core/management/ base.py」、195行目、run_from_argv + self.execute(* args、* options。 dict )+ File "/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 + for( get_app_errors()。items()のapp_name、error):+ファイル「/home/app_name/webapps/app_name/lib/python2.5/django/db/models/loading.py」、get_app_errors + selfの131行目_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)ファイル" /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行目、+クラスTag(models.Model):+ファイル" / home / app_name / webapps / app_name / django_app /../django_app/forum/models.py"、53行目、Tag + objects = TagManager() NameError:name '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 回答


1


あなたの問題はあなたです:

forum.managersインポートから*(18行でmodels.py)forum.modelsインポートから*(6行でmanagers.py)

これはどのように機能しますか? これを平坦化してみて(手動で新しいファイルにコピーして貼り付けてインポートを行ってください)、「objects = TagManager()」行を実行するまでにmanagersモジュールの一部を実行できなかった理由がわかります。 TagManagerは、18行目より前に定義されていない限り定義されています。

いくつかの一般的なヒント:

  1. 可能な限り*インポートを避けてください(Pythonプログラムが難しくなります 何も読まない場合)

  2. そのような循環インポートがある場合は、それらを分割してみてください。 しばしば 1つのモジュールでインポートを関数呼び出しに移動したり、いくつかの要素をリファクタリングして3つ目のモジュールにインポートしたりできます。 モジュール内でインポートを下に移動してみることもできますが、これは時々機能します。