Leerzeichen im Pfad - Problem für os.path.exists?

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
Python93
User
Beiträge: 36
Registriert: Mittwoch 13. Juni 2012, 07:50

Hallo zusammen,

ich habe drei Verzeichnisse, in denen ich ein File auf Existenz überprüfen möchte:
  • - C:\\Program Files\\Hummingbird\\Connectivity\\13.00\\Exceed\\xstart.exe
  • - C:\\Programme\\Hummingbird\\Connectivity\\13.00\\Exceed\\xstart.exe
  • - C:\\Program Files(x86)\\Hummingbird\\Connectivity\\13.00\\Exceed\\xstart.exe
Mittels os.path.exists("..") ermittle ich 'True' oder 'False'. Befindet sich die Datei xstart.exe jedoch im letzten Verzeichnis, liefert er mir leider False zurück.
Nach ein wenig nachlesen im Internet, habe ich auch schon probiert '"\\Pfad"' zu machen. Das ging leider auch nicht.

Kennt ihr irgendein Trick, wie ich (ohne die Verzeichnisse umzubenennen) trotzdem 'True' zurückbekomme?
Oder alternativ einen anderen Weg um zu überprüfen, ob eine Datei in einem Verzeichnis liegt?


Hier habe ich mal einen Ausschnitt aus dem Quellcode. Ich prüfe auf eine Datei und wenn sich die Datei in dem überprüften Verzeichnis befindet, starte ich sie und übergebe ganz viele Parameter.
Aber wenn ich die Datei in das letzte Verzeichnis packe, liefert er mir False zurück. Vermutung liegt ja auf dem Leerzeichen im Pfad.

Kann mir bitte jmd helfen? Dankeschön.

Code: Alles auswählen

if os.path.exists("C:\\Program Files\\Hummingbird\\Connectivity\\13.00\\Exceed\\xstart.exe") == True:
    pfad = '"C:\\Program Files\\Hummingbird\\Connectivity\\13.00\\Exceed\\"'
    subprocess.Popen('"c:\\Program Files\\Hummingbird\\Connectivity\\13.00\\Exceed\\xstart.exe"' + " -m telnet" + " -h " + ip + " -c " + '"export PLM_MODE=edb; aixterm -ls  -fn 10x20 -geometry 80x42 -sb -display @d -e catiaPC -xterm"')
    
elif os.path.exists("C:\\Programme\\Hummingbird\\Connectivity\\13.00\\Exceed\\xstart.exe") == True: 
    pfad = '"C:\\Programme\\Hummingbird\\Connectivity\\13.00\\Exceed\\"'
    subprocess.Popen('"c:\\Programme\\Hummingbird\\Connectivity\\13.00\\Exceed\\xstart.exe"' + " -m telnet" + " -h " + ip + " -c " + '"export PLM_MODE=edb; aixterm -ls  -fn 10x20 -geometry 80x42 -sb -display @d -e catiaPC -xterm"')
        
elif os.path.exists("C:\\Program Files(x86)\\Hummingbird\\Connectivity\\13.00\\Exceed\\xstart.exe") == True:
    pfad = '"C:\\Program Files(x86)\\Hummingbird\\Connectivity\\13.00\\Exceed\\"'
    subprocess.Popen('"c:\\Program Files(x86)\\Hummingbird\\Connectivity\\13.00\\Exceed\\xstart.exe"' + " -m telnet" + " -h " + ip + " -c " + '"export PLM_MODE=edb; aixterm -ls  -fn 10x20 -geometry 80x42 -sb -display @d -e catiaPC -xterm"')
Ich benutze:
- Python 2.7
- Windows XP
Benutzeravatar
sparrow
User
Beiträge: 4193
Registriert: Freitag 17. April 2009, 10:28

1. Es sieht komisch aus, wenn du etwas, dass bereits einen Wahrheitswert zurück liefert gegen True prüfst. Du würdest ja auch nicht if True == True schreiben.
2. os.path.exists kommt prima mit Leerzeichen klar. Das ist also nicht dein Problem:

Code: Alles auswählen

>>> import os
>>> os.path.exists(r"c:\temp\space test\test.txt")
True
3. Du solltest die Zeichenketten für subprocess nicht so zusammensetzen. Subprocess nimmt gerne Tupel entgegen, wobei jeder Einrag einem Argument entspricht. Dann muss man sich um das Quoten nicht kümmern. Womöglich liegt da dein Problem.

Zeig doch mal im Interpreter wie es schief geht.

Ganz nebenbei:
In meiner VM heißt das Verzeichnis nicht "Program Files(x86)" sondern "Program Files (x86)". Python hat also recht: die Datei existiert nicht.
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

Hallo Python93,

eines der grundlegendsten Prinzipien überhaupt ist Don't-Repeat-Yourself.

Code: Alles auswählen

program_file_directory_names = ['Program Files', 'Programme', 'Program Files(x86)']
for program_file_directory_name in program_file_directory_names:
    xstart = r"C:\{0}\Hummingbird\Connectivity\13.00\Exceed\xstart.exe".format(program_file_directory_name)
    if os.path.exists(xstart):
        break
else:
    raise AssertionError("xstart not found!")

subprocess.Popen([xstart,
    '-m', 'telnet',
    '-h', ip,
    '-c','export PLM_MODE=edb; aixterm -ls  -fn 10x20 -geometry 80x42 -sb -display @d -e catiaPC -xterm'])
BlackJack

@Python93: Ich tippe auf ein Problem mit Leerzeichen, allerdings nicht bei Python sondern bei Dir, denn ich bin mir ziemlich sicher, dass zwischen 'Files' und '(x86)' eines fehlt.
Python93
User
Beiträge: 36
Registriert: Mittwoch 13. Juni 2012, 07:50

Oke... ja BlackJack, du hast Recht gehabt *peinlich* :oops:
Als ich das Programm geschrieben hatte, hatte ich offenbar zwischen dem Files und (x86) kein Leerzeichen gesehen :P

Vielen vielen Dank für die Tipps noch, Sirius3 und sparrow.
Ich benutze:
- Python 2.7
- Windows XP
Antworten