Ich habe früher Dateien geöffnet, die sich im selben Verzeichnis wie das aktuell ausgeführte Python-Skript befanden, indem ich einfach einen Befehl wie verwendet habe
open("Some file.txt", "r")
Ich stellte jedoch fest, dass beim Ausführen des Skripts in Windows durch Doppelklicken versucht wurde, die Datei aus dem falschen Verzeichnis zu öffnen.
Seitdem habe ich einen Befehl des Formulars verwendet
open(os.path.join(sys.path[0], "Some file.txt"), "r")
wann immer ich eine Datei öffnen wollte. Dies funktioniert für meine spezielle Verwendung, aber ich bin nicht sicher, ob sys.path[0]
es in einem anderen Anwendungsfall fehlschlagen könnte.
Meine Frage lautet also: Was ist der beste und zuverlässigste Weg, um eine Datei zu öffnen, die sich im selben Verzeichnis befindet wie das aktuell ausgeführte Python-Skript?
Folgendes konnte ich bisher herausfinden:
os.getcwd()
undos.path.abspath('')
geben Sie das "aktuelle Arbeitsverzeichnis" zurück, nicht das Skriptverzeichnis.os.path.dirname(sys.argv[0])
undos.path.dirname(__file__)
geben Sie den Pfad zurück, der zum Aufrufen des Skripts verwendet wird. Dieser kann relativ oder sogar leer sein (wenn sich das Skript im cwd befindet). Auch__file__
gibt es nicht , wenn das Skript in IDLE oder PythonWin ausgeführt wird.sys.path[0]
undos.path.abspath(os.path.dirname(sys.argv[0]))
scheinen das Skriptverzeichnis zurückzugeben. Ich bin mir nicht sicher, ob es einen Unterschied zwischen diesen beiden gibt.
Bearbeiten:
Ich habe gerade festgestellt, dass das, was ich tun möchte, besser als "Öffnen einer Datei im selben Verzeichnis wie das enthaltende Modul" beschrieben werden kann. Mit anderen Worten, wenn ich ein Modul importiere, das ich geschrieben habe und das sich in einem anderen Verzeichnis befindet, und dieses Modul eine Datei öffnet, möchte ich, dass es nach der Datei im Verzeichnis des Moduls sucht. Ich glaube nicht, dass irgendetwas, was ich gefunden habe, dazu in der Lage ist ...
__file__
nicht verwendet werden kann, verwenden Siesys.argv[0]
anstelle vondirname(__file__)
. Der Rest sollte wie erwartet funktionieren. Ich verwende es gerne,__file__
weil es im Bibliothekscodesys.argv[0]
möglicherweise überhaupt nicht auf Ihren Code verweist, insbesondere wenn es über ein Skript eines Drittanbieters importiert wird.