Wir arbeiten mit einem Code-Repository, das sowohl unter Windows als auch unter Linux bereitgestellt wird - manchmal in verschiedenen Verzeichnissen. Wie sollte eines der Module im Projekt auf eine der Nicht-Python-Ressourcen im Projekt verweisen (CSV-Dateien usw.)?
Wenn wir so etwas machen wie:
thefile=open('test.csv')
oder:
thefile=open('../somedirectory/test.csv')
Es funktioniert nur, wenn das Skript aus einem bestimmten Verzeichnis oder einer Teilmenge der Verzeichnisse ausgeführt wird.
Was ich gerne machen würde, ist so etwas wie:
path=getBasePathOfProject()+'/somedirectory/test.csv'
thefile=open(path)
Ist es möglich?
python
path
relative-path
Olamundo
quelle
quelle
__file__
), '..', '..', 'resources')os.pardir
ist etwas besser als'..'
, obwohl die beiden unter POSIX und Windows gleichwertig sind.Wenn Sie Setup-Tools verwenden oder verteilen (eine setup.py-Installation), scheint der "richtige" Weg, auf diese gepackten Ressourcen zuzugreifen, package_resources zu verwenden.
In Ihrem Fall wäre das Beispiel
Was natürlich die Ressource und die gelesenen Binärdaten liest, wäre der Wert von my_data
Wenn Sie nur den Dateinamen benötigen, können Sie auch verwenden
Beispiel:
Der Vorteil ist, dass es garantiert funktioniert, auch wenn es sich um eine Archivverteilung wie ein Ei handelt.
Siehe http://packages.python.org/distribute/pkg_resources.html#resourcemanager-api
quelle
__file__
wie in guten alten Zeiten verwendet?In Python beziehen sich die Pfade auf das aktuelle Arbeitsverzeichnis , in den meisten Fällen auf das Verzeichnis, in dem Sie Ihr Programm ausführen. Das aktuelle Arbeitsverzeichnis ist sehr wahrscheinlich nicht dasselbe wie das Verzeichnis Ihrer Moduldatei. Daher ist die Verwendung eines Pfads relativ zu Ihrer aktuellen Moduldatei immer eine schlechte Wahl.
Die Verwendung des absoluten Pfades sollte die beste Lösung sein:
quelle
Ich benutze oft etwas Ähnliches:
Die Variable
Enthält den Dateinamen des Skripts, in das Sie diesen Code schreiben, sodass Sie Pfade relativ zum Skript erstellen können, die jedoch weiterhin mit absoluten Pfaden geschrieben sind. Es funktioniert aus mehreren Gründen recht gut:
Sie müssen jedoch auf Plattformkompatibilität achten - Windows os.pathsep unterscheidet sich von UNIX.
quelle
Sie versuchen auch, Ihre
cwd
Verwendung zu normalisierenos.path.abspath(os.getcwd())
. Mehr Infos hier .quelle
cwd
Pfad eines Moduls istSie können die eingebaute
__file__
Variable verwenden. Es enthält den Pfad der aktuellen Datei. Ich würde getBaseOfProject in einem Modul im Stammverzeichnis Ihres Projekts implementieren. Dort würde ich den Wegteil bekommen__file__
und das zurückgeben. Diese Methode kann dann überall in Ihrem Projekt verwendet werden.quelle
Ich war hier ein bisschen ratlos. Wollte einige Ressourcendateien in eine Raddatei packen und darauf zugreifen. Hat die Verpackung die Manifestdatei verwendet, aber pip install hat sie nur installiert, wenn es sich um ein Unterverzeichnis handelt. In der Hoffnung, dass diese Szenenaufnahmen helfen
MANIFEST.in
Erstellt ein Weel mit Standard setup.py. pip hat die Raddatei installiert. Überprüfen Sie nach der Installation, ob Ressourcen installiert sind. Sie sind
In tfclient.py, um auf diese Dateien zuzugreifen. von
Und es funktioniert.
quelle
Ich habe lange Zeit damit verbracht, die Antwort darauf herauszufinden, aber ich habe sie endlich verstanden (und es ist eigentlich ganz einfach):
Dadurch wird der relative Pfad Ihres Unterordners an die Verzeichnisse angehängt, in denen Python angezeigt werden soll. Es ist ziemlich schnell und schmutzig, aber es funktioniert wie ein Zauber :)
quelle
open('your/subfolder/of/choice')
trotzdem tun .