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?


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__)) 

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.