2009-11-06 15 views
136

Gibt es eine Möglichkeit, das laufende Befehlsverzeichnis in Pythons subprocess.Popen() anzugeben?Arbeitsverzeichnis für popen angeben

Zum Beispiel:

Popen('c:\mytool\tool.exe',workingdir='d:\test\local') 

Mein Python-Skript befindet sich in C:\programs\python

ist möglich C:\mytool\tool.exe im Verzeichnis D:\test\local laufen?

Wie lege ich das Arbeitsverzeichnis für einen Unterprozess fest?

+1

bedenken, dass subprocess .call ist nur ein dünner Wrapper über subprocess.Popen, und dieser Wrapper behandelt auch alle Argumente von Popen, zumindest soweit ich mich erinnere :) In einfachen Fällen besser bei subprocess.call bleiben – shabunc

Antwort

192

subprocess.Popentakes a cwd argument, um das aktuelle Arbeitsverzeichnis festzulegen; Sie sollten auch Ihre Backslashes ('d:\\test\\local') umgehen oder r'd:\test\local' verwenden, damit die Backslashes nicht von Python als Escape-Sequenzen interpretiert werden. So wie Sie es geschrieben haben, wird der \t Teil in eine Registerkarte übersetzt.

Also, sollten Sie Ihre neue Zeile wie folgt aussehen:

subprocess.Popen(r'c:\mytool\tool.exe', cwd=r'd:\test\local') 

Um Ihren Python-Skript Pfad als cwd zu verwenden, import os und definieren cwd mit diesem:

os.path.dirname(os.path.realpath(__file__)) 
+2

Was effe ct, wenn überhaupt, würde hinzufügen Shell = True zu den Argumenten haben auf auch die Einstellung cwd? –

+2

@T. Stone: Für eine eigenständige ausführbare Datei sollte nichts geändert werden, es sei denn, die EXE hängt von einigen Umgebungsvariablen in der Shell ab. Aber mit 'shell = False' können Sie keine eingebaute Shell wie' cd' verwenden: dh, versuchen Sie dies unter Linux mit Shell in beide Richtungen: 'subprocess.Popen (" cd/tmp; pwd ")' –

+1

danke viel! es wirkt wie ein Zauber! – icn