364 Stimmen

Wie bestimmen Sie das aktuelle Skriptverzeichnis richtig?

Ich möchte sehen, was ist der beste Weg, um das aktuelle Skript-Verzeichnis in Python zu bestimmen.

Ich habe festgestellt, dass es aufgrund der vielen Möglichkeiten, Python-Code aufzurufen, schwierig ist, eine gute Lösung zu finden.

Hier sind einige Probleme:

  • __file__ ist nicht definiert, wenn das Skript mit exec , execfile
  • __module__ ist nur in Modulen definiert

Anwendungsfälle:

  • ./myfile.py
  • python myfile.py
  • ./somedir/myfile.py
  • python somedir/myfile.py
  • execfile('myfile.py') (von einem anderen Skript, das sich in einem anderen Verzeichnis befinden kann und ein anderes aktuelles Verzeichnis haben kann.

Ich weiß, dass es keine perfekte Lösung gibt, aber ich bin auf der Suche nach dem besten Ansatz, der die meisten Fälle löst.

Der am häufigsten verwendete Ansatz ist os.path.dirname(os.path.abspath(__file__)) aber das funktioniert nicht, wenn Sie das Skript von einem anderen Skript aus ausführen mit exec() .

Warnung

Jede Lösung, die das aktuelle Verzeichnis verwendet, wird fehlschlagen. Dieses kann je nach Art des Skriptaufrufs unterschiedlich sein oder innerhalb des laufenden Skripts geändert werden.

1voto

Jahid Punkte 19666

Dies sollte in den meisten Fällen funktionieren:

import os,sys
dirname=os.path.dirname(os.path.realpath(sys.argv[0]))

1voto

Mark Punkte 19

Hoffentlich hilft das:- Wenn Sie ein Skript/Modul von irgendwoher ausführen, können Sie auf die __file__ die eine Modulvariable ist, die den Speicherort des Skripts angibt.

Wenn Sie hingegen den Interpreter verwenden, haben Sie keinen Zugriff auf diese Variable, wo Sie einen Namen erhalten NameError y os.getcwd() gibt Ihnen das falsche Verzeichnis an, wenn Sie die Datei von einem anderen Ort aus starten.

Diese Lösung sollte Ihnen in jedem Fall das bieten, wonach Sie suchen:

from inspect import getsourcefile
from os.path import abspath
abspath(getsourcefile(lambda:0))

Ich habe es nicht gründlich getestet, aber es hat mein Problem gelöst.

1voto

Soap Punkte 237

Wenn __file__ ist verfügbar:

# -- script1.py --
import os
file_path = os.path.abspath(__file__)
print(os.path.dirname(file_path))

Für diese wollen wir in der Lage sein, den Befehl vom Interpreter aus auszuführen oder den Pfad des Ortes zu erhalten, von dem aus Sie das Skript ausführen:

# -- script2.py --
import os
print(os.path.abspath(''))

Dies funktioniert über den Interpreter. Aber wenn es in einem Skript ausgeführt (oder importiert) wird, gibt es den Pfad des Verzeichnisses an, in dem Sie das Skript ausgeführt haben, nicht den Pfad des Verzeichnisses, das das Skript mit dem Ausdruck enthält.

Exemple :

Wenn Ihre Verzeichnisstruktur

test_dir (in the home dir)
 main.py
 test_subdir
     script1.py
     script2.py

mit

# -- main.py --
import script1.py
import script2.py

Die Ausgabe ist:

~/test_dir/test_subdir
~/test_dir

1voto

muxator Punkte 186

Um den absoluten Pfad zu dem Verzeichnis zu erhalten, das das aktuelle Skript enthält, können Sie verwenden:

from pathlib import Path
absDir = Path(__file__).parent.resolve()

Bitte beachten Sie die .resolve() Aufruf ist erforderlich, da dieser den Pfad absolut setzt. Ohne resolve() würde man etwa Folgendes erhalten '.' .

Diese Lösung verwendet pathlib , die seit Version 3.4 (2014) Teil der Python-Stdlib ist. Dies ist vorteilhaft im Vergleich zu anderen Lösungen, die os .

Die offizielle pathlib Dokumentation enthält eine nützliche Tabelle, die den alten os Funktionen auf die neuen übertragen: https://docs.python.org/3/library/pathlib.html#correspondence-to-tools-in-the-os-module

0voto

touhidurrr Punkte 80

Da die bisherigen Antworten erfordern, dass Sie ein Modul importieren, dachte ich, dass ich eine Antwort schreiben würde, die das nicht tut. Verwenden Sie den folgenden Code, wenn Sie nichts importieren möchten.

dir = '/'.join(__file__.split('/')[:-1])
print(dir)

Wenn das Skript auf /path/to/script.py dann würde folgendes gedruckt /path/to . Beachten Sie, dass dies zu einem Fehler im Terminal führt, da keine Datei ausgeführt wird. Dies parst im Grunde das Verzeichnis von __file__ den letzten Teil davon zu entfernen. In diesem Fall /script.py wird entfernt, um die Ausgabe zu erhalten /path/to .

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X