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")
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
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
.
Joint les commandes avec "&&".
os.system('echo a > outputa.txt && echo b > outputb.txt')
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
>>> command = "echo a; echo b"
>>> shlex.split(command);
['echo', 'a; echo', 'b']
le problème est que le module shlex ne gère pas ";"