412 Stimmen

Warum funktioniert os.path.join() in diesem Fall nicht?

Der nachstehende Code wird nicht zusammengefügt, da der Befehl beim Debuggen nicht den gesamten Pfad, sondern nur den letzten Eintrag speichert.

os.path.join('/home/build/test/sandboxes/', todaystr, '/new_sandbox/')

Wenn ich dies teste, wird nur die /new_sandbox/ Teil des Codes.

550voto

Craig McQueen Punkte 39286

Die letztgenannten Zeichenfolgen sollten nicht mit einem Schrägstrich beginnen. Wenn sie mit einem Schrägstrich beginnen, werden sie als "absoluter Pfad" betrachtet und alles davor wird verworfen.

Zitat aus dem Python-Dokumente für os.path.join :

Handelt es sich bei einer Komponente um einen absoluten Pfad, werden alle vorherigen Komponenten verworfen und die Verbindung wird ab der Komponente mit dem absoluten Pfad fortgesetzt.

Beachten Sie unter Windows das Verhalten in Bezug auf Laufwerksbuchstaben, das sich im Vergleich zu früheren Python-Versionen geändert zu haben scheint:

Unter Windows wird der Laufwerksbuchstabe nicht zurückgesetzt, wenn eine absolute Pfadkomponente (z. B., r'\foo' ) angetroffen wird. Wenn eine Komponente einen Laufwerksbuchstaben enthält, werden alle vorherigen Komponenten verworfen und der Laufwerksbuchstabe wird zurückgesetzt. Beachten Sie, dass es für jedes Laufwerk ein aktuelles Verzeichnis gibt, os.path.join("c:", "foo") stellt einen Pfad relativ zum aktuellen Verzeichnis auf dem Laufwerk C: ( c:foo ), nicht c:\foo .

170voto

Antony Hatchkins Punkte 28362

Die Idee der os.path.join() ist es, Ihr Programm plattformübergreifend zu machen (Linux/Windows/etc).

Schon ein einziger Hieb macht es zunichte.

Es macht also nur Sinn, wenn es in Verbindung mit einem Bezugspunkt wie os.environ['HOME'] o os.path.dirname(__file__) .

93voto

ghammond Punkte 982

os.path.join() kann in Verbindung verwendet werden mit os.path.sep um einen absoluten und keinen relativen Pfad zu erstellen.

os.path.join(os.path.sep, 'home','build','test','sandboxes',todaystr,'new_sandbox')

34voto

miku Punkte 170688

Verwenden Sie keine Schrägstriche am Anfang von Pfadkomponenten, es sei denn, Sie beziehen sich auf das Stammverzeichnis:

os.path.join('/home/build/test/sandboxes', todaystr, 'new_sandbox')

siehe auch: http://docs.python.org/library/os.path.html#os.path.join

32voto

David Wolever Punkte 138377

Um zu verstehen, warum dieses überraschende Verhalten nicht vollständig schrecklich, betrachten Sie eine Anwendung, die den Namen einer Konfigurationsdatei als Argument akzeptiert:

config_root = "/etc/myapp.conf/"
file_name = os.path.join(config_root, sys.argv[1])

Wenn die Anwendung mit ausgeführt wird:

$ myapp foo.conf

Die Konfigurationsdatei /etc/myapp.conf/foo.conf verwendet werden.

Aber was passiert, wenn die Anwendung mit aufgerufen wird?

$ myapp /some/path/bar.conf

Dann myapp sollte verwenden Sie die Konfigurationsdatei unter /some/path/bar.conf (und nicht /etc/myapp.conf/some/path/bar.conf oder ähnlich).

Es mag nicht großartig sein, aber ich glaube, das ist die Motivation für das absolute Pfadverhalten.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X