web-dev-qa-db-fra.com

exécuter plusieurs commandes bash avec un sous-processus

Si je lance echo a; echo b dans bash, les deux commandes seront exécutées. Cependant, si j'utilise un sous-processus, la première commande est exécutée et affiche le reste de la ligne . Le code ci-dessous echos a; echo b au lieu de a b, comment l'obtenir pour exécuter les deux commandes?

import subprocess, shlex
def subprocess_cmd(command):
    process = subprocess.Popen(shlex.split(command), stdout=subprocess.PIPE)
    proc_stdout = process.communicate()[0].strip() 
    print proc_stdout

subprocess_cmd("echo a; echo b")
27
Paul

Vous devez utiliser Shell = True dans le sous-processus et aucun shlex.split:

def subprocess_cmd(command):
    process = subprocess.Popen(command,stdout=subprocess.PIPE, Shell=True)
    proc_stdout = process.communicate()[0].strip()
    print proc_stdout

subprocess_cmd('echo a; echo b')

résultats:

a
b
52
bougui

Je suis juste tombé sur une situation où je devais exécuter un tas de lignes de code bash (non séparées par des points-virgules) à partir de python. Dans ce scénario, les solutions proposées n’aident pas. Une solution consisterait à enregistrer un fichier, puis à l'exécuter avec Popen, mais ce n'était pas possible dans mon cas.

Ce que j'ai fini par faire est quelque chose comme:

commands = '''
echo "a"
echo "b"
echo "c"
echo "d"
'''

process = subprocess.Popen('/bin/bash', stdin=subprocess.PIPE, stdout=subprocess.PIPE)
out, err = process.communicate(commands)
print out

Donc, je crée d'abord le processus enfant bash et après je lui dis quoi exécuter. Cette approche supprime les limitations du passage direct de la commande au constructeur Popen.

14
admenva

Joint les commandes avec "&&".

os.system('echo a > outputa.txt && echo b > outputb.txt')
7
FrancisWolcott

Si vous n'exécutez les commandes que d'un seul coup, vous pouvez simplement utiliser subprocess.check_output fonctionnalité:

def subprocess_cmd(command):
    output = subprocess.check_output(command, Shell=True)
    print output
1
Pierz
>>> command = "echo a; echo b"
>>> shlex.split(command);
    ['echo', 'a; echo', 'b']

le problème est que le module shlex ne gère pas ";"

0
David.Zheng