2010-12-07 13 views
13

Die Dokumentation für das OS-Modul scheint keine Informationen darüber zu enthalten, wie eine Datei geöffnet wird, die sich nicht in einem Unterverzeichnis oder dem aktuellen Verzeichnis befindet, in dem das Skript ausgeführt wird vollständigen Pfad. Meine Verzeichnisstruktur sieht so aus.Python os-Modul geöffnete Datei über aktuellem Verzeichnis mit relativem Pfad

/home/matt/project/dir1/cgi-bin/script.py 
/home/matt/project/fileIwantToOpen.txt 

open("../../fileIwantToOpen.txt","r") 

Gibt eine Datei nicht gefunden Fehler. Aber wenn ich einen Python-Interpreter im cgi-bin-Verzeichnis starte und open("../../fileIwantToOpen.txt","r") versuche, funktioniert es. Ich möchte aus offensichtlichen Portabilitätsgründen nicht den vollständigen Pfad fest codieren. Gibt es eine Reihe von Methoden im OS-Modul, die CAN dies tun?

+0

Hmm. Dies könnte ein Berechtigungsfehler sein, oder das Arbeitsverzeichnis für das CGI ist möglicherweise nicht dasselbe wie Ihr Python-Interpreter. Die genaue Fehlermeldung könnte helfen. Versuchen Sie auch in Ihrem CGI 'print os.getcwd()' und sehen Sie, was das sagt. –

+0

Wird Ihr CGI-Skript in einem Chroot-Gefängnis ausgeführt? Wenn ja, dann wird das nicht funktionieren, da du nicht aus dem Gefängnis entkommen kannst. –

+0

@ Adam Rosenfield Nr. @Jason Ich führe den Python-Interpreter buchstäblich im cgi-bin-Verzeichnis, so dass ich nicht verstehe, wie es in diesem Skript funktioniert und nicht innerhalb des Skripts, das im cgi-bin-Verzeichnis ausgeführt wird. –

Antwort

33

Der angegebene Pfad zu open sollte relativ zum aktuellen Arbeitsverzeichnis sein, dem Verzeichnis, aus dem Sie das Skript ausführen. Das obige Beispiel funktioniert also nur, wenn Sie es aus dem Verzeichnis cgi-bin ausführen.

Eine einfache Lösung wäre, Ihren Pfad relativ zum Skript zu machen. Eine mögliche Lösung.

from os import path 

basepath = path.dirname(__file__) 
filepath = path.abspath(path.join(basepath, "..", "..", "fileIwantToOpen.txt")) 
f = open(filepath, "r") 

diese Weise werden Sie den Pfad des Skripts erhalten Sie (basepath) und kommen, dass mit dem relativen Pfad der Datei, die Sie öffnen möchten laufen. os.path kümmert sich um die Details der Verbindung der beiden Pfade.

+0

Dieser Befehl gibt mir ../../fileIwantToOpen.txt als den Pfad und es kann immer noch nicht finden . –

+0

Diesen habe ich ausprobiert und scheint gut zu funktionieren. – terminus

+0

@terminus: 'basepath = os.path.dirname (sys.argv [0])', und 'os.path.join (basispfad, '..', '..', 'fileIwantToOpen.txt')'. Ich würde auch '__file__' anstelle von' sys.argv [0] 'selbst verwenden. –

3

Dies sollten Sie in das Verzeichnis bewegen, wo sich das Skript befindet, wenn Sie bereits nicht da sind:

file_path = os.path.dirname(__file__) 
if file_path != "": 
    os.chdir(file_path) 
open("../../fileIwantToOpen.txt","r")