PYTHONPATH Ausgabe auf einem Produktionsserver und Namespace Herausforderung
-
20-09-2019 - |
Frage
Ich bin von einigen Fehlern wirklich verwirrt Ich erhalte als ich versuche, eine App in Produktion zu setzen. Alles funktioniert gut auf der Entwicklung Maschine, aber ich kann den Django-Shell auf dem Produktionsserver nicht syncdb oder eingeben. Ich erhalte eine Fehlermeldung, wenn forum.models.py Versuche, Import forum.managers.py ist, weil die Modelle noch nicht im Namensraum sind.
Ich denke, es ist ein PYTHONPATH Problem sein könnte, aber es hat eine seltsame Huhn oder Ei Aspekt. Ich verstehe nicht, warum TagManager nicht im Namensraum ist.
TagManager importiert über:
von forum.managers importieren *
Welche wird, bevor die die TagManager Klasse ausgeführt wird aufgerufen.
$ python2.5 manage.py syncdb
Traceback (jüngste Aufforderung zuletzt):
File "manage.py", Zeile 11, in
execute_manager (Einstellungen)
File "/home/app_name/webapps/app_name/lib/python2.5/django/core/management/init.py", Zeile 362, in execute_manager
utility.execute ()
File "/home/app_name/webapps/app_name/lib/python2.5/django/core/management/init.py", Zeile 303, in ausführen
self.fetch_command (subcommand) .run_from_argv (self.argv)
File "/home/app_name/webapps/app_name/lib/python2.5/django/core/management/base.py", Linie 195, in run_from_argv
self.execute (* args, ** Optionen. dict )
File "/home/app_name/webapps/app_name/lib/python2.5/django/core/management/base.py", Zeile 221, in ausführen
self.validate ()
File "/home/app_name/webapps/app_name/lib/python2.5/django/core/management/base.py", Zeile 249, in validate
NUM_ERRORS = get_validation_errors (s, app)
File "/home/app_name/webapps/app_name/lib/python2.5/django/core/management/validation.py", Zeile 28, in get_validation_errors
für (app_name, Fehler) in get_app_errors () Produkte ():.
File "/home/app_name/webapps/app_name/lib/python2.5/django/db/models/loading.py", Linie 131, in get_app_errors
self._populate ()
File "/home/app_name/webapps/app_name/lib/python2.5/django/db/models/loading.py", Zeile 58, in _populate
self.load_app (app_name, True)
File "/home/app_name/webapps/app_name/lib/python2.5/django/db/models/loading.py", Zeile 74, in load_app
Modelle = import_module (‘. Modelle, app_name)
File "/home/app_name/webapps/app_name/lib/python2.5/django/utils/importlib.py", Zeile 35, in import_module
Import (Name)
File "/home/app_name/webapps/app_name/django_app/../django_app/forum/models.py", Zeile 18, in
von forum.managers importieren *
File "/home/app_name/webapps/app_name/django_app/forum/managers.py", Zeile 6, in
von forum.models importieren *
File "/home/app_name/webapps/app_name/django_app/../django_app/forum/models.py", Zeile 43, in
Klasse-Tag (models.Model):
File "/home/app_name/webapps/app_name/django_app/../django_app/forum/models.py", Zeile 53, in Tag
Objekte = TagManager ()
Nameerror: name 'TagManager' ist nicht definiert
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>
>>>
Lösung
Ihr Problem ist, dass Sie tun:
von forum.managers * importieren (in Zeile 18 models.py) von forum.models importieren * (in Zeile 6 managers.py)
Wie kann das überhaupt funktionieren? Versuchen Sie, diese aus Abflachung (tun die Importe von Hand Kopieren und Einfügen in eine neue Datei), und Sie werden sehen, warum, von der Zeit, die die Linie führt „Objekte = TagManager ()“ es unmöglich ausgeführt haben, können den Teil des Manager-Modul wo TagManager definiert ist, sofern sie nicht vorher Linie 18 definiert wurde.
Einige allgemeine Tipps:
- Vermeiden Sie die * Importe, wann immer möglich (es Python-Programme erschwert, wenn nichts anderes lesen)
- Wenn Sie Kreis Importe so haben, versuchen, sie zu brechen. Oft in einem Modul können Sie den Import in einen Funktionsaufruf bewegen, oder Sie können einige Elemente in ein drittes Modul Refactoring, dass sowohl aus importieren. Sie können auch versuchen, den Import niedriger im Modul bewegt, die manchmal funktioniert.