2017-07-11 6 views
2

Ich arbeite an einem Teil eines Python-Projekts und die Struktur ist wie folgt: project/some_folder/another_folder/my_work. In diesem Ordner ist die Datei mit dem Code run.py. Im selben Ordner habe ich auch eine input_file, von der ich einige Daten gelesen, verarbeitet, und schreibe das Ergebnis auf output_file. So in run.py Ich habe so etwas wie:Wie setze ich den Pfad zur Ein-/Ausgabedatei richtig?

with open("input_file") as f: 
    do_something() 

und

with open("output_file") as f: 
    store_the_result() 

Dies funktioniert gut, wenn ich den Code in project/some_folder/another_folder/my_work auszuführen. Wenn ich jedoch zu project gehen und den Code mit python -m some_folder.another_folder.my_work.run ausführen, habe ich Probleme beim Zugriff auf die Eingabedatei. Ich habe versucht, dieses Problem zu lösen, indem ich den aboslute-Pfad zu den Dateien verwende, aber das funktioniert nur auf meinem Rechner. Wenn jemand meinen Code auf seine Maschine kopiert, muss er/sie trotzdem den fest codierten absoluten Pfad ändern.

So legen Sie den Pfad zu den Dateien so fest, dass ich das Programm entweder im Ordner mit der Eingabe- und Ausgabedatei starten oder es als Modul ausführen kann und andere den Pfad zur Datei nicht ändern müssen Code auf ihren Maschinen laufen lassen?

Antwort

2

Sie können den Pfad zum Laufmodul und dann einen vollständigen Pfad von dort erstellen relativ:

import os 

module_path = os.path.dirname(os.path.realpath(__file__)) 

input_path = os.path.join(module_path, 'input_file') 
output_path = os.path.join(module_path, 'output_file') 

with open(input_path) as f: 
    do_something() 

with open(output_path) as f: 
    store_the_result() 
+0

'module_path = os.path.dirname (os.path.realpath (__ Datei __))' funktioniert nicht für mich. Ich muss stattdessen 'module_path = os.path.dirname (os.path.realpath (" __ file __ "))' 'stattdessen verwenden. – s9527

+0

Das ist seltsam, wenn ich '" __file __ "' (mit Anführungszeichen) verwende, dann bekomme ich das aktuelle Arbeitsverzeichnis, nicht das Modulverzeichnis. Wenn ich '" __file __ "' benutze, bekomme ich dasselbe Ergebnis wie mit '" __some_random_string __ "'. Wenn Sie sagen, dass es nicht funktioniert, meinen Sie, dass es einen Fehler gibt? –

+0

In meinem Fall wird '" __file __ "' auch die CWD geben, aber '__file__' wirft einfach' NameError: Name '__file__' ist nicht definiert'. – s9527

0

Wenn Sie nicht explizit den „input_file“ Pfad angeben, geht davon aus Python, dass es in den aktuellen wohnt Verzeichnis, in dem Sie Ihr Python-Skript ausführen. Die Antwort von Paco H sollte das Problem lösen.

Verwandte Themen