250 votes

Comment puis-je spécifier le répertoire de travail pour un processus subprocess?

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

Par exemple :

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

Mon script Python est situé dans C:\programmes\python

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

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

3 votes

Gardez à l'esprit que subprocess.call n'est qu'une mince enveloppe de subprocess.Popen, et cette enveloppe gère également tous les arguments de Popen, du moins autant que je m'en souvienne :) Dans les cas simples, il vaut mieux se tenir à subprocess.call

0 votes

Vous devriez maintenant probablement préférer subprocess.run, bien que call et les enveloppes légèrement plus récentes héritées check_call et check_output soient toujours disponibles.

368voto

Mark Rushakoff Points 97350

subprocess.Popen prend un argument cwd pour définir le répertoire de travail actuel ; vous voudrez également échapper à vos barres obliques inverses ('d:\\test\\local'), ou utiliser r'd:\test\local' pour que les barres obliques inverses ne soient pas interprétées comme des séquences d'échappement par Python. La façon dont vous l'avez écrite, la partie \t sera traduite en une tabulation.

Donc, votre nouvelle ligne devrait ressembler à :

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

Pour utiliser le chemin de votre script Python comme répertoire de travail, import os et définissez le répertoire de travail de cette manière :

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

3 votes

Quel effet, le cas échéant, aurait l'ajout de Shell=True aux arguments sur le réglage du répertoire de travail actuel ?

3 votes

@T. Stone : Pour un exécutable autonome, cela ne devrait rien changer, sauf si l'exécutable dépend de certaines variables d'environnement dans le shell, peut-être. Mais, avec shell=False, vous ne pouvez pas utiliser une commande interne du shell telle que cd : c'est-à-dire, essayez ceci sur Linux avec le shell des deux manières : subprocess.Popen("cd /tmp; pwd")

0 votes

Je dois exécuter un programme de la même manière mais avec un chemin associé. J'ai essayé de l'exécuter comme suit: (r'c:\mytool\tool.exe -fPath\to\file.txt', cwd=r'd:\test\local') mais cela n'a pas fonctionné. Des suggestions ?

12voto

ashrasmun Points 129

Une autre façon de faire est simplement de le faire

cwd = os.getcwd()
os.chdir('c:\some\directory')
subprocess.Popen('tool.exe')
os.chdir(cwd)

Cette solution fonctionne si vous souhaitez vous fier aux chemins relatifs, par exemple, si l'emplacement de votre outil est c:\some\directory\tool.exe. L'argument clé cwd pour Popen ne vous permettra pas de le faire. Certains scripts/outils peuvent avoir besoin que vous soyez dans le répertoire donné lors de leur invocation. Pour rendre ce code moins bruyant, c'est-à-dire séparer la logique liée au changement de répertoires de la "logique métier", vous pouvez utiliser un décorateur.

def invoke_at(path: str):
    def parameterized(func):
        def wrapper(*args, **kwargs):
            cwd = os.getcwd()
            os.chdir(path)

            try:
                ret = func(*args, **kwargs)
            finally:
                os.chdir(cwd)

            return ret

        return wrapper

    return parameterized            

Un tel décorateur peut ensuite être utilisé de la manière suivante:

@invoke_at(r'c:\some\directory')
def start_the_tool():
    subprocess.Popen('tool.exe')

6voto

AJ. Points 12912

Ce que vous voulez, c'est os.chdir(). Jetez un œil à cet exemple :

import os

f=os.popen('./checkfile.sh')
data=f.read()
f.close()
print data

os.chdir('../')
f=os.popen('tmpdir/checkfile.sh')
data=f.read()
f.close()
print data

Et voici le contenu de checkfile.sh :

#!/bin/bash

if [ -e testfile.txt ]
then
    echo "Oui"
else
    echo "Non"
fi

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X