web-dev-qa-db-fra.com

Exécution en ligne de commande dans un dossier différent

J'appelle un programme de ligne de commande dans python en utilisant l'appel os.system(command).

Comment puis-je appeler cette commande en passant un dossier différent pour exécution? Il y a un appel système pour cela? Ou je devrais enregistrer le dossier actuel et, après exécution, modifier le restaurer.

42
Victor

Le module subprocess est une très bonne solution.

import subprocess
p = subprocess.Popen([command, argument1,...], cwd=working_directory)
p.wait()

Il a également des arguments pour modifier les variables d'environnement, rediriger les entrées/sorties vers le programme appelant, etc.

76
hynekcer

Essayez de os.chdir(path) avant d'appeler la commande.

De ici :

os.chdir (chemin) Remplacez le répertoire de travail actuel par chemin.

Disponibilité: Unix, Windows

[~ # ~] modifier [~ # ~]

Cela changera le répertoire de travail actuel, vous pouvez obtenir le fonctionnement actuel en:

os.getcwd()

Si vous souhaitez l'enregistrer et le restaurer plus tard, si vous avez besoin de travailler dans le répertoire de travail d'origine.

EDIT 2

Dans tous les cas, vous devriez probablement passer à subprocess ( doc ) comme suggéré ici . Si vous utilisez subprocessPopen, vous avez le choix de fournir le paramètre cwd pour spécifier le répertoire de travail du sous-processus: lire ceci .

subprocess.Popen(args, bufsize=0, executable=None, stdin=None,
stdout=None, stderr=None, preexec_fn=None, close_fds=False,
Shell=False, cwd=None, env=None, universal_newlines=False,
startupinfo=None, creationflags=0)

...

Si cwd n'est pas None, le répertoire courant de l'enfant sera changé en cwd avant d'être exécuté. Notez que ce répertoire n'est pas pris en compte lors de la recherche de l'exécutable, vous ne pouvez donc pas spécifier le chemin du programme par rapport à cwd.

10
zenpoy

Ici, j'ai fait une petite fonction pour changer le chemin sur lequel vous travaillez:

import os
def make_path(r_path):  
    ack = 1
    try:
        root = os.path.dirname(__file__)
        rel_path = os.path.join("..", r_path)

        abs_path = os.path.join(root, rel_path)
        os.chdir(abs_path)
        ack = 0
    except Exception as details:
        print('problem to get to the path '+r_path+' (0001) : ' + str(details))
    return ack

Donc, ici, r_path Est le chemin relatif vers lequel vous voulez aller. J'ai ajouté ".." À la méthode path.join() donc, si vous êtes dans un dossier et que vous voulez le quitter avant de rechercher votre chemin, il le fait automatiquement. Donc, si votre répertoire relatif ressemble à ceci:

-path_to_reach
    -a_random_file.txt
-your_current_folder
    -your_program.py

vous pouvez faire ces lignes pour aller dans le path_to_reach et faire votre commande, par exemple:

command = ls
make_path('path_to_reach/')
os.system(command)

Cette commande ne serait pas utile, mais vous voyez l'idée!

1