Ich habe einen Ordner für meinen Clientcode, einen Ordner für meinen Servercode und einen Ordner für Code, der von ihnen gemeinsam genutzt wird
Proj/
Client/
Client.py
Server/
Server.py
Common/
__init__.py
Common.py
Wie importiere ich Common.py aus Server.py und Client.py?
Antworten:
EDIT Nov 2014 (3 Jahre später):
Python 2.6 und 3.x unterstützen ordnungsgemäße relative Importe, bei denen Sie Hacking vermeiden können. Mit dieser Methode wissen Sie, dass Sie eher einen relativen als einen absoluten Import erhalten. Das '..' bedeutet, gehe in das Verzeichnis über mir:
Als Einschränkung funktioniert dies nur, wenn Sie Ihre Python als Modul von außerhalb des Pakets ausführen . Beispielsweise:
Ursprünglicher hackiger Weg
Sie können Common / zu Ihrem sys.path hinzufügen (die Liste der Pfade, die Python zum Importieren von Dingen betrachtet):
os.path.dirname(__file__)
Sie erhalten nur das Verzeichnis, in dem sich Ihre aktuelle Python-Datei befindet. Anschließend navigieren wir zu 'Common /' und importieren das Modul 'Common'.quelle
from ...myfile
geht zu../../myfile
Komisch genug, ein Problem, das ich gerade getroffen habe, und ich bekomme diese Arbeit auf folgende Weise:
In Kombination mit dem Linux-Befehl
ln
können wir die Sache viel einfacher machen:Und jetzt, wenn Sie
some_stuff
aus Datei importieren möchten :Proj/Common/Common.py
in Ihre Datei :Proj/Client/Client.py
, einfach so:Und das gleiche gilt für
Proj/Server
, funktioniert auch für densetup.py
Prozess, eine gleiche Frage hier diskutiert , hoffe es hilft!quelle
Führen Sie keinen relativen Import durch.
Aus PEP8 :
Fügen Sie Ihren gesamten Code in ein Superpaket (dh "myapp") ein und verwenden Sie Unterpakete für Client, Server und allgemeinen Code.
Update: " Python 2.6 und 3.x unterstützen ordnungsgemäße relative Importe (...) ". Weitere Informationen finden Sie in Daves Antworten .
quelle
if __name__ == "__main__":
Zeile ' ' am Ende von Client und Server Code hinzu. Das heißt, Sie möchten sie als eigenständige Skripte verwenden können. Wie mache ich das richtig? Ich denke, es ist ein durchaus üblicher Anwendungsfall, der unterstützt werden sollte. Warum wird davon abgeraten?Ein relativer Import ist absolut in Ordnung! Hier ist, was das kleine Ich tut:
quelle
__file__
, um die richtige Beziehung aus der aktuellen Datei zu erhaltenDie Standardimportmethode aus dem PYTHONPATH ist bereits "relativ". Der PYTHONPATH wird standardmäßig für einige Systembibliotheken zusammen mit dem Ordner der ursprünglichen Quelldatei verwendet. Wenn Sie mit -m ausführen, um ein Modul auszuführen, wird das aktuelle Verzeichnis zum PYTHONPATH hinzugefügt. Wenn sich der Einstiegspunkt Ihres Programms in Proj befindet,
import Common.Common
sollte die Verwendung sowohl in Server.py als auch in Client.py funktionieren.Führen Sie keinen relativen Import durch. Es wird nicht so funktionieren, wie Sie es wollen.
quelle