Um meinen Python-Stil zu verbessern, habe ich einen PEP-8-Style-Checker auf einem meiner Skripts ausgeführt und dabei etwas beschwert, von dem ich nicht weiß, wie ich es beheben soll. Der Prolog des Skripts ist etwas wie:
%Vor% und der Style-Checker beschweren sich über die import mymodule
-Zeile und geben an, dass es ein Top-File sein sollte. Aber ich kann es offensichtlich nicht verschieben, bevor ich den Weg dorthin einstelle, wo es gefunden wird. Gibt es einen guten Weg, dies zu erreichen (die Eingabe einer Umgebungsvariablen oder eines Shell-Wrappers ist nicht das, was ich besser finde als mein aktueller Code), während gleichzeitig die PEP-8-Empfehlungen eingehalten werden?
Wenn Sie Pfadmanipulationen vermeiden möchten, können Sie dies möglicherweise mithilfe des weniger bekannten Features .pth
tun.
sys.path
sollte mit dem Verzeichnis beginnen, das das Hauptprogramm enthält, entweder nach Name oder durch Verweis als ''. Ich nehme an, dass die Datei, die mymodule
importiert, nicht Teil von mypackage
ist, so dass der '' Eintrag nicht zum Importieren von mymodule
geeignet ist.
sys.path
sollte mit dem Verzeichnis site-packages
für die ausführende Binärdatei enden. Das ist der normale Ort für hinzugefügte Pakete. Wenn Sie mypackage
nicht in site-packages
verschieben möchten, können Sie letztere 'virtuell' erweitern, indem Sie eine Datei mystuff.pth
darin einfügen. Es sollte eine Zeile enthalten: den Pfad zum Verzeichnis mit mypackage
. Nennen Sie es myprojects
. Dann können mypackage
und jedes andere Paket in myprojects
importiert werden, als wären sie in site-packages
.
Ein Vorteil von .pth-Dateien ist, dass Sie identische Kopien in mehrere Site-Packages-Verzeichnisse einfügen können. Zum Beispiel habe ich mehrere Projekte in F:/python
. Ich habe mehrere Versionen von Python installiert. Also habe ich python.pth
mit dieser Zeile in die Site-Pakete für jeden eingefügt.
Die beste Strategie wäre, den Code sys.path
in eine separate Datei zu legen und sie in die Arbeitscodedatei zu importieren.
Also, ich werde den Code in zwei Dateien aufteilen. Ein Name my_module.py
und ein anderer Name working_module.py
Jetzt enthält my_module
unter Zeilen
und working_module
enthalten
weil wir my_module
vor mypackage
importieren, wird vorher der Pfad-bezogene Code ausgeführt und Ihr Paket ist im Pfad verfügbar.
Sie können importlib
module (python 3.5) oder imp
für python 2.7 verwenden, um mypackage.mymodule
programmatisch zu laden. Beide haben den gleichen Zweck:
Mechanismen zur Implementierung der Import-Anweisung
Diese Frage könnte Ihnen mehr helfen: Wie wird ein Modul mit dem vollständigen Pfad importiert?