Ich benutzen Dateien zu öffnen, die als den aktuell laufenden Python-Skript im selben Verzeichnis waren einfach durch einen Befehl wieWie zuverlässig eine Datei im selben Verzeichnis wie ein Python-Skript öffnet
open("Some file.txt", "r")
jedoch mit, ich Wenn das Skript in Windows ausgeführt wurde, indem es doppelt geklickt wurde, wurde versucht, die Datei aus dem falschen Verzeichnis zu öffnen.
Seitdem habe ich einen Befehl der Form verwendet
open(os.path.join(sys.path[0], "Some file.txt"), "r")
, wenn ich eine Datei öffnen wollte. Dies funktioniert für meine spezielle Verwendung, aber ich bin mir nicht sicher, ob sys.path[0]
in einem anderen Anwendungsfall fehlschlagen kann.
Meine Frage ist also: Was ist die beste und zuverlässigste Möglichkeit, eine Datei zu öffnen, die sich im selben Verzeichnis befindet wie das aktuell ausgeführte Python-Skript?
Hier ist, was ich in der Lage gewesen, so weit, um herauszufinden:
os.getcwd()
undos.path.abspath('')
das „aktuelle Arbeitsverzeichnis“ zurückzukehren, nicht das Skriptverzeichnis.os.path.dirname(sys.argv[0])
undos.path.dirname(__file__)
geben Sie den Pfad zum Aufruf des Skripts zurück, der relativ oder sogar leer sein kann (wenn sich das Skript in der cwd befindet). Außerdem ist__file__
nicht vorhanden, 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.
Edit:
Ich habe erkannt, dass das, was ich besser machen will als „eine Datei als Modul enthält, in demselben Verzeichnis öffnen“ würde beschrieben. Mit anderen Worten, wenn ich ein Modul, das ich geschrieben habe, in ein anderes Verzeichnis importiere, und dieses Modul eine Datei öffnet, möchte ich, dass es nach der Datei im Verzeichnis des Moduls sucht. Ich glaube nicht, alles, was ich gefunden habe in der Lage ist, das zu tun ...
Wenn '__file__' nicht verwendet werden kann, verwenden Sie' sys.argv [0] 'anstelle von' dirname (__ file __) '. Der Rest sollte wie erwartet funktionieren. Ich benutze gerne "__file__", weil 'sys.argv [0]' im Bibliothekscode möglicherweise gar nicht auf Ihren Code zeigt, besonders wenn Sie über ein Drittanbieter-Skript importiert werden. –
Das Problem dabei ist, es wird variieren, wenn Sie die Datei direkt aus dem Unterbrecher ausgeführt wird oder wenn es importiert wird. Siehe meine Antwort für die Unterschiede zwischen __file__ und sys.argv [0] – Zimm3r
So ist es richtig zu sagen, dass die in Zimm3r Antwort beschrieben Variation ist mit "realpath (join (getcwd(), dirname (__ file__))" als hier beschrieben? – pianoJames