Das Problem
Ich habe eine grundlegende Dateistruktur wie folgt:und laufen mit -m in Apache2
parent_dir/
foo/
Models.py
bar/
NeedsModels.py
baz/
AlsoNeedsModels.py
auf meinem lokalen Rechner, Ich betreibe NeedsModels.py
mit python3 -m
:
python3 -m bar.NeedsModels
... während mein aktuellen Arbeitsverzeichnis parent_dir
ist.
Dies funktioniert wie beabsichtigt, und ich kann Models.py
von beiden NeedsModels.py
und AlsoNeedsModels.py
verwenden, indem Sie:
import foo.Models
Dies ist jedoch nicht auf dem Apache2
Server funktioniert ich aus 2 Gründen bin bereitstellen:
Das aktuelle Arbeitsverzeichnis beim Zugriff auf
NeedsModels.py
ist nichtparent_dir
.Das Skript wird nicht mit
-m
ausgeführt.
Mit einem Standard shebang in NeedsModels.py
, wie folgt aus:
#!/usr/bin/python3 -m
... Fehler (Relative module names not supported
), weil es entspricht in etwa zu:
python3 -m ./NeedsModels
My (hackish) Lösung
Ich fand eine Lösung dafür, indem ich diesen Shebang an die Spitze setzte NeedsModels.py
(von diesen question inspiriert):
#!/bin/sh
""":"
cd ../ && exec python3 -m bar.NeedsModels
"""
Offensichtlich ist dies eine schreckliche Hack ist.
Ich habe die Apache2
docs auf CGI-Skripte gelesen. Aus meiner Sicht wird nicht erwähnt, das aktuelle Arbeitsverzeichnis eines Skripts zu ändern. Ich habe auch im Internet gesucht und konnte keine relevanten Informationen finden.
Wunsch Antworten
Gibt es einen besseren Weg, um dieses Skript mit -m
und in der richtigen Arbeitsverzeichnis ohne Änderung der Projektdateistruktur zu laufen? (ich bin mir bewusst, dass NeedsModels.py
in parent_dir
bewegt dieses Problem wäre zu beheben, aber das ist keine Option für mich.)
Oder können die import
Aussagen geändert werden sowohl lokal als auch auf dem Server zu arbeiten?
Danke für die Antwort. Gibt es eine Möglichkeit, dies zu erreichen, ohne viele Dateien zu ändern? Zum Beispiel hängt 'NeedsModels.py' von vielen anderen Projektdateien ab, die ähnliche 'import'-Anweisungen verwenden. –
Ja. Sie können den PYTHONPATH in Ihrer .bash_rc-Datei anhängen. sys.path nimmt seine Werte tatsächlich von dort. –