Ich habe ein Verzeichnis voller Skripte (sagen wir mal project/bin
). Ich habe auch eine Bibliothek in project/lib
und möchte, dass die Skripte sie automatisch laden. Dies ist, was ich normalerweise oben in jedem Skript verwende:
#!/usr/bin/python
from os.path import dirname, realpath, sep, pardir
import sys
sys.path.append(dirname(realpath(__file__)) + sep + pardir + sep + "lib")
# ... now the real code
import mylib
Dies ist etwas umständlich, hässlich und muss am Anfang jeder Datei eingefügt werden. Gibt es einen besseren Weg, dies zu tun?
Ich hoffe wirklich auf etwas so Glattes wie dieses:
#!/usr/bin/python
import sys.path
from os.path import pardir, sep
sys.path.append_relative(pardir + sep + "lib")
import mylib
Oder noch besser, etwas, das nicht kaputt gehen würde, wenn mein Editor (oder jemand anderes, der Zugriff festgeschrieben hat) beschließt, die Importe im Rahmen seines Bereinigungsprozesses neu zu ordnen:
#!/usr/bin/python --relpath_append ../lib
import mylib
Das würde nicht direkt auf Nicht-Posix-Plattformen portieren, aber es würde die Dinge sauber halten.
python
python-import
James Harr
quelle
quelle
Antworten:
Wenn Sie nicht jede Datei bearbeiten möchten
oder
PYTHONPATH
auf Ihrelib
oder wenn Sie bereit sind, jeder Datei eine einzelne Zeile hinzuzufügen, fügen Sie oben eine Importanweisung hinzu, z
behalte
import_my_lib.py
in bin undimport_my_lib
kann den Python-Pfad korrekt auf das einstellen, waslib
du willstquelle
Das benutze ich:
quelle
__file__
es sich um einen relativen Dateinamen handelt, der sich auf das aktuelle Arbeitsverzeichnis bezieht (z. B.setup.py
), istos.path.dirname(__file__)
dies die leere Zeichenfolge. Für diese und ähnliche von John Jiang Bedenken , ekhumoro ‚s mehr Allzweck-Lösung stark bevorzugt wird.Ich benutze:
quelle
sys.path.append('.')
__file__
stattdessen einfach wie bei jedem quasi vernünftigen Entwickler.Erstellen Sie ein Wrapper-Modul
project/bin/lib
, das Folgendes enthält:Dann können Sie alle Cruft oben in Ihren Skripten durch Folgendes ersetzen:
quelle
Wenn Sie den
.
Skriptinhalt in keiner Weise ändern möchten, stellen Sie dem aktuellen Arbeitsverzeichnis $ PYTHONPATH voran (siehe Beispiel unten).Und nenn es einen Tag!
quelle
Verwenden von Python 3.4+ Außer
Verwendung von cx_freeze oder Verwendung in IDLE. 😃
quelle
Sie können das Skript mit
python -m
aus dem entsprechenden Stammverzeichnis ausführen. Und übergeben Sie den "Modulpfad" als Argument.Beispiel:
$ python -m module.sub_module.main # Notice there is no '.py' at the end.
Ein anderes Beispiel:
quelle
Bei jeder Antwort gibt es ein Problem, das wie folgt zusammengefasst werden kann: "Fügen Sie diese magische Beschwörung einfach am Anfang Ihres Skripts hinzu. Sehen Sie, was Sie mit nur ein oder zwei Codezeilen tun können." Sie werden nicht in jeder möglichen Situation funktionieren!
Zum Beispiel verwendet eine solche magische Beschwörung eine Datei . Wenn Sie Ihr Skript mit cx_Freeze verpacken oder IDLE verwenden, führt dies leider zu einer Ausnahme.
Eine andere solche magische Beschwörung verwendet os.getcwd (). Dies funktioniert nur, wenn Sie Ihr Skript über die Eingabeaufforderung ausführen und das Verzeichnis, das Ihr Skript enthält, das aktuelle Arbeitsverzeichnis ist (dh, Sie haben den Befehl cd verwendet, um vor dem Ausführen des Skripts in das Verzeichnis zu wechseln). Eh Götter! Ich hoffe, ich muss nicht erklären, warum dies nicht funktioniert, wenn sich Ihr Python-Skript irgendwo im PATH befindet und Sie es ausgeführt haben, indem Sie einfach den Namen Ihrer Skriptdatei eingegeben haben.
Glücklicherweise gibt es eine magische Beschwörung, die in allen von mir getesteten Fällen funktioniert. Leider ist die magische Beschwörung mehr als nur ein oder zwei Codezeilen.
Wie Sie sehen, ist dies keine leichte Aufgabe!
quelle
Dieser funktioniert am besten für mich. Verwenden:
Auf dem Mac sollte etwas gedruckt werden wie:
Um den ABS-Pfad zum aktuellen WD zu erhalten, ist dieser besser, da Sie jetzt nach oben gehen können, wenn Sie möchten, wie folgt:
Und nun:
Wenn Sie also
utils
von hier importieren möchten, müssen'/Users/<your username>/'
Sie nur noch Folgendes tun:
quelle
Ich sehe einen Schebang in Ihrem Beispiel. Wenn Sie Ihre bin Skripte wie Laufen
./bin/foo.py
, stattpython ./bin/foo.py
, gibt es eine Möglichkeit , das shebang zu ändern$PYTHONPATH
variabel.Sie können Umgebungsvariablen jedoch nicht direkt in shebangs ändern, sodass Sie ein kleines Hilfsskript benötigen. Legen Sie dies
python.sh
in Ihrenbin
Ordner:Und dann die shebang Ihrer ändern
./bin/foo.py
zu sein#!bin/python.sh
quelle
Wenn wir versuchen, eine Python-Datei mit einem Pfad vom Terminal aus auszuführen.
Speichern Sie die Datei (test.py).
Laufendes System.
Öffnen Sie das Terminal und gehen Sie in das Verzeichnis, in dem sich die Datei befindet. dann schreibe
Drücke Enter
Ausgabe:
quelle