Come posso specificare la directory di lavoro per popen


187

C'è un modo per specificare la directory di comando in esecuzione in Python's subprocess.Popen()?

Per esempio:

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

Il mio script Python si trova in C:\programs\python

È possibile eseguire C:\mytool\tool.exenella directory D:\test\local?

Come posso impostare la directory di lavoro per un processo secondario?


2
tieni presente che subprocess.call è solo un sottile wrapper su subprocess.Popen e questo wrapper tratta anche tutti gli argomenti di Popen, almeno per quanto mi ricordo :) In casi semplici, meglio attenersi a subprocess.call
shabunc

Risposte:


270

subprocess.Popen accetta un cwdargomento per impostare la directory di lavoro corrente; vorrai anche sfuggire alle tue barre rovesciate ( 'd:\\test\\local') o usarle in r'd:\test\local'modo che le barre rovesciate non vengano interpretate come sequenze di fuga da Python. Come hai scritto, la \tparte verrà tradotta in a tab.

Quindi, la tua nuova linea dovrebbe apparire come:

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

Per utilizzare il percorso dello script Python come cwd import ose definire cwd usando questo:

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

2
Quale effetto, se presente, aggiungendo Shell = True agli argomenti avrebbe anche sull'impostazione di cwd?
T. Stone,

3
@T. Stone: per un eseguibile autonomo, non dovrebbe cambiare nulla, a meno che l'exe non dipenda da alcune variabili di ambiente nella shell, forse. Ma, con shell=False, non è possibile utilizzare una shell incorporata come cd: ad esempio, provare questa su Linux con shell in entrambi i modi:subprocess.Popen("cd /tmp; pwd")
Mark Rushakoff

12
Almeno in Python 3, non devi usare le barre rovesciate anche quando su una macchina Windows, l'ho appena fatto subprocess.call(["C:/Users/Bob/Some.exe"], cwd="C:/Users/Jane/")e funziona bene
mgrandi

7
La directory di lavoro deve essere un percorso assoluto?
DXsmiley,

10
Funziona anche con subprocess.check_output (). Grazie !
Samuel Dauzon,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.