2012-04-16 6 views
23

Können sagen, Sie ein Modul haben dieeinen Dateipfad "immer relativ zum aktuellen Modul" erstellen?

myfile = open('test.txt', 'r') 

enthält und die ‚test.txt‘ Datei im selben Ordner. Wenn Sie das Modul ausführen, wird die Datei erfolgreich geöffnet. Nehmen wir an, Sie importieren dieses Modul von einem anderen, das sich in einem anderen Ordner befindet. Die Datei wird nicht im selben Ordner wie das Modul mit dem Code gesucht. Also, wie das Modul Dateien mit relativen Pfaden im selben Ordner zuerst suchen? Es gibt verschiedene Lösungen mit "__file__" oder "os.getcwd()", aber ich hoffe, es gibt einen saubereren Weg, wie das gleiche Sonderzeichen in der Zeichenfolge, die Sie an open() oder file() übergeben.

+0

Was ist das Problem mit 'os.getcwd()'? – cfedermann

+1

'os.getcwd()' gibt den Pfad des ersten Moduls zurück, das dieses Modul importiert oder ein anderes Modul importiert hat, das es importiert hat. Das erste Modul kann in vielen Verzeichnissen nach oben oder unten sein. Es scheint also nicht sehr elegant zu sein, "os.getcwd() + 'irgendwas/somethingselse/yetanother/finallyhere'' –

+1

einzugeben. Nun, dann probiere die vorgeschlagene' sys.modules' Antwort unten aus: – cfedermann

Antwort

31

Die Lösung ist __file__ zu verwenden, und es ist ziemlich sauber:

import os 

TEST_FILENAME = os.path.join(os.path.dirname(__file__), 'test.txt') 
+0

+1, in der Tat! Sie können sogar os.path importieren. – Emmanuel

+0

'import os.path' ist sinnlos, wenn Sie' os importieren', importiert das Modul 'os.path' für Sie (' os' ist so besonders). Man könnte 'from os import path' verwenden, ist aber im Falle des' os' Moduls nicht üblich. Es ist sehr wahrscheinlich, dass er bereits "Import-Os" in seinem Modul hat oder bald benötigt. Daher ist 'Import os' fast immer die beste Wahl. – yak

+0

Ich denke, das ist so sauber, wie Sie bekommen können. Alles andere würde fragen, wie der offizielle Python-Interpreter funktioniert. –