Bug in os.path.abspath() unter Windows?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Bin wieder mal auf was Komisches gestoßen. Getestet unter Windows.

Wenn man an os.path.abspath() als Pfad lediglich einen Windows-Laufwerksbuchstaben (mit Doppelpunkt) übergibt, sollte das Ergebnis einen abschließenden Backslash enthalten. Beispiel:

Code: Alles auswählen

import os
print os.path.abspath("C:")
# results: "C:"
Kopiert mal den folgenden Code in eine Datei und speichert sie entweder auf Laufwerk C:\Temp oder D:\Temp

Code: Alles auswählen

import os
print 'CWD is %s' % os.getcwd()
path = "C:"
print 'os.path.abspath("%s") results %s' % (path, os.path.abspath(path))
path = "D:"
print 'os.path.abspath("%s") results %s' % (path, os.path.abspath(path))
Abhängig vom 'Current Working Directory' entstehen hier unterschiedliche Ergebnisse:

Nun begebt euch mal mit der Konsole jeweils nach C:\Temp bzw. D:\Temp und führt das Skript von dort aus aus. Hier was bei mir passiert:
cmd.exe hat geschrieben:C:\Dokumente und Einstellungen\user>cd c:\temp

C:\Temp>%ProgramFiles%\Python24\python.exe bug_os.path.abspath.py
CWD is C:\Temp
os.path.abspath("C:") results C:\Temp
os.path.abspath("D:") results D:\

C:\Temp>d:

D:\>cd d:\temp

D:\temp>%ProgramFiles%\Python24\python.exe bug_os.path.abspath.py
CWD is D:\temp
os.path.abspath("C:") results C:\Temp
os.path.abspath("D:") results D:\temp

D:\temp>c:

C:\Temp>cd c:\windows\system32\drivers

C:\WINDOWS\system32\drivers>d:

D:\temp>%ProgramFiles%\Python24\python.exe bug_os.path.abspath.py
CWD is D:\temp
os.path.abspath("C:") results C:\WINDOWS\system32\drivers
os.path.abspath("D:") results D:\temp

D:\temp>cd wol

D:\temp\wol>%ProgramFiles%\Python24\python.exe d:\temp\bug_os.path.abspath.py
CWD is D:\temp\wol
os.path.abspath("C:") results C:\WINDOWS\system32\drivers
os.path.abspath("D:") results D:\temp\wol

D:\temp\wol>
Seht ihr was ich meine? Python "merkt" sich irgendwie das 'Current Working Directory' von jedem Laufwerk und gibt bei print os.path.abspath("C:") plötzlich das zuletzt benutzte 'CWD' anstelle 'C:\' aus.

Ist das denn so gewollt?
BlackJack

droptix hat geschrieben:Seht ihr was ich meine? Python "merkt" sich irgendwie das 'Current Working Directory' von jedem Laufwerk und gibt bei print os.path.abspath("C:") plötzlich das zuletzt benutzte 'CWD' anstelle 'C:\' aus.

Ist das denn so gewollt?
Nicht Python merkt sich ein CWD pro Laufwerk sondern Windows. Das ist ein "feature" aus den guten alten DOS Zeiten.
droptix
User
Beiträge: 521
Registriert: Donnerstag 13. Oktober 2005, 21:27

Aber Python ist plattformübergreifend, nicht Windows. Sollte Python nicht dafür sorgen, dass bei os.path.abspath("C:") immer dasselbe rauskommt?

Ich kann ja nicht einmal mit os.chdir("C:") das 'CWD' wechseln, um den Fehler zu vermeiden. Sonst würde ich mir vor dem Prozess das aktuelle 'CWD' merken, meine os.path.abspath()-Befehle durchlaufen lassen und anschließend wieder in das ursprüngliche 'CWD' wechseln.
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

droptix hat geschrieben:Aber Python ist plattformübergreifend, nicht Windows. Sollte Python nicht dafür sorgen, dass bei os.path.abspath("C:") immer dasselbe rauskommt?
Nein. Python will nicht alle Plattformeigenheiten überspielen, weil das in vielen Fällen auch gar nicht funktioniert.
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

droptix hat geschrieben:Aber Python ist plattformübergreifend, nicht Windows. Sollte Python nicht dafür sorgen, dass bei os.path.abspath("C:") immer dasselbe rauskommt?
Und was sollte da deiner Meinung nach unter Unix rauskommen? '/boot'?

Ääh ja nee... also da kommt vielleicht schon das selbe wie unter Windows bei raus. Aber es ist eben Windows-spezifisch und da kann Python nicht viel machen. Bswp. das Handling von Verzeichnis- und Pfad-Separatoren (\, /, :) wird aber anhand der Zielplattform durch os.path.join() und Konsorten korrekt umgesetzt.
Antworten