Comment puis-je spécifier le répertoire de travail pour popen

187

Existe-t-il un moyen de spécifier le répertoire en cours d'exécution de la commande dans Python subprocess.Popen()?

Par exemple:

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

Mon script Python se trouve dans C:\programs\python

Est-il possible d'exécuter C:\mytool\tool.exedans le répertoire D:\test\local?

Comment définir le répertoire de travail d'un sous-processus?

icn
la source
2
gardez à l'esprit que subprocess.call n'est qu'un mince wrapper sur subprocess.Popen, et ce wrapper traite également tous les arguments de Popen, du moins autant que je me souvienne :) Dans des cas simples, mieux vaut s'en tenir à
subprocess.call

Réponses:

270

subprocess.Popen prend un cwdargument pour définir le répertoire de travail actuel; vous voudrez également échapper vos contre-obliques ( 'd:\\test\\local'), ou utiliser r'd:\test\local'pour que les contre-obliques ne soient pas interprétées comme des séquences d'échappement par Python. La manière dont vous l'avez écrite, la \tpartie sera traduite en un fichier tab.

Donc, votre nouvelle ligne devrait ressembler à:

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

Pour utiliser votre chemin de script Python comme cwd import oset définir cwd en utilisant ceci:

os.path.dirname(os.path.realpath(__file__)) 
Mark Rushakoff
la source
2
Quel effet, le cas échéant, l'ajout de Shell = True aux arguments aurait-il également sur la définition du cwd?
T. Pierre
3
@T. Stone: Pour un exécutable autonome, cela ne devrait rien changer, à moins que l'exe ne dépende de certaines variables d'environnement dans le shell, peut-être. Mais, avec shell=False, vous ne pouvez pas utiliser un shell intégré tel que cd: c'est-à-dire essayez ceci sous Linux avec le shell dans les deux sens:subprocess.Popen("cd /tmp; pwd")
Mark Rushakoff
12
En python 3 au moins, vous n'avez pas à utiliser de barres obliques inverses même sur une machine Windows, je viens de le faire subprocess.call(["C:/Users/Bob/Some.exe"], cwd="C:/Users/Jane/")et cela fonctionne bien
mgrandi
7
Le répertoire de travail doit-il être un chemin absolu?
DXsmiley
10
Cela fonctionne aussi pour subprocess.check_output (). Merci !
Samuel Dauzon