¿Cómo puedo especificar el directorio de trabajo para popen

187

¿Hay alguna manera de especificar el directorio de comando en ejecución en Python subprocess.Popen()?

Por ejemplo:

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

Mi script de Python se encuentra en C:\programs\python

¿Es posible ejecutar C:\mytool\tool.exeen el directorio D:\test\local?

¿Cómo configuro el directorio de trabajo para un subproceso?

icn
fuente
2
tenga en cuenta que subprocess.call es solo una envoltura delgada sobre subprocess.Popen, y esta envoltura también trata con todos los argumentos de Popen, al menos hasta donde recuerdo :) En casos simples, mejor se adhieren a subprocess.call
shabunc

Respuestas:

270

subprocess.Popen toma un cwdargumento para establecer el Directorio de trabajo actual; también querrá escapar de sus barras diagonales inversas ( 'd:\\test\\local'), o usarlas r'd:\test\local'para que Python no interprete las barras diagonales inversas como secuencias de escape. De la forma en que lo tiene escrito, la \tparte se traducirá a a tab.

Entonces, su nueva línea debería verse así:

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

Para usar su ruta de script Python como cwd, import osy defina cwd usando esto:

os.path.dirname(os.path.realpath(__file__)) 
Mark Rushakoff
fuente
2
¿Qué efecto, si lo hubiera, agregar Shell = True a los argumentos también tendría que establecer cwd?
T. Stone el
3
@T. Stone: para un ejecutable independiente, no debería cambiar nada, a menos que el exe dependa de algunas variables de entorno en el shell, tal vez. Pero, con shell=False, no puede usar un shell integrado como cd: es decir, intente esto en Linux con shell en ambos sentidos:subprocess.Popen("cd /tmp; pwd")
Mark Rushakoff el
12
En Python 3, al menos, que no tiene que emplear estas últimas incluso cuando en una máquina Windows, yo sólo hice subprocess.call(["C:/Users/Bob/Some.exe"], cwd="C:/Users/Jane/")y funciona bien
mgrandi
77
¿El directorio de trabajo tiene que ser una ruta absoluta?
DXsmiley
10
Funciona también para subprocess.check_output (). Gracias !
Samuel Dauzon