Wie kann ich ein Arbeitsverzeichnis für Popen angeben?

185

Gibt es eine Möglichkeit, das laufende Befehlsverzeichnis in Pythons anzugeben subprocess.Popen()?

Beispielsweise:

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

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

Ist es möglich, C:\mytool\tool.exeim Verzeichnis auszuführen D:\test\local?

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

icn
quelle
2
Denken Sie daran, dass subprocess.call nur ein dünner Wrapper über subprocess.Popen ist, und dieser Wrapper behandelt auch alle Argumente von Popen, zumindest soweit ich mich erinnere :)
Halten Sie sich

Antworten:

268

subprocess.Popen nimmt ein cwdArgument , um das aktuelle Arbeitsverzeichnis festzulegen; Sie möchten auch Ihre Backslashes ( 'd:\\test\\local') maskieren oder verwenden, r'd:\test\local'damit die Backslashes von Python nicht als Escape-Sequenzen interpretiert werden. So wie Sie es geschrieben haben, wird der \tTeil in a übersetzt tab.

Ihre neue Zeile sollte also folgendermaßen aussehen:

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

So verwenden Sie Ihren Python-Skriptpfad als cwd import osund definieren cwd folgendermaßen:

os.path.dirname(os.path.realpath(__file__)) 
Mark Rushakoff
quelle
2
Welche Auswirkung hätte das Hinzufügen von Shell = True zu den Argumenten, wenn überhaupt, auf das Festlegen des cwd?
T. Stone
3
@T. Stone: Für eine eigenständige ausführbare Datei sollte nichts geändert werden, es sei denn, die Exe hängt möglicherweise von einigen Umgebungsvariablen in der Shell ab. Aber mit shell=Falsekönnen Sie keine eingebaute Shell verwenden, wie zum Beispiel cd: Versuchen Sie dies unter Linux mit Shell in beide Richtungen:subprocess.Popen("cd /tmp; pwd")
Mark Rushakoff
12
Zumindest in Python 3 müssen Sie keine Backslashes verwenden, selbst wenn Sie auf einem Windows-Computer arbeiten. Ich habe es gerade getan subprocess.call(["C:/Users/Bob/Some.exe"], cwd="C:/Users/Jane/")und es funktioniert
einwandfrei
7
Muss das Arbeitsverzeichnis ein absoluter Pfad sein?
DXsmiley
10
Es funktioniert auch für subprocess.check_output (). Vielen Dank !
Samuel Dauzon