J'ai de nombreuses commandes shell qui doivent être exécutées dans mon script python. Je sais que je ne dois pas utiliser shell=true, comme indiqué. aquí et que je peux utiliser les sorties et les entrées std dans le cas où j'ai des tuyaux dans la commande comme mentionné ci-dessus. aquí .
Mais le problème est que mes commandes shell sont complexes et pleines de tuyaux, donc j'aimerais faire une méthode générique qui serait utilisée par mon script.
J'ai fait un petit test ci-dessous, mais il est suspendu après l'impression du résultat (j'ai simplifié juste pour mettre ici). Quelqu'un peut-il me renseigner ?
- Pourquoi la pendaison.
- S'il y a une meilleure méthode pour le faire.
Merci.
PS : Ce n'est qu'une petite partie d'un grand projet python et il y a des raisons professionnelles pour lesquelles j'essaie de faire cela. Merci.
#!/usr/bin/env python3
import subprocess as sub
from subprocess import Popen, PIPE
import shlex
def exec_cmd(cmd,p=None,isFirstLoop=True):
if not isFirstLoop and not p:
print("Error, p is null")
exit()
if "|" in cmd:
cmds = cmd.split("|")
while "|" in cmd:
# separates what is before and what is after the first pipe
now_cmd = cmd.split('|',1)[0].strip()
next_cmd = cmd.split('|',1)[-1].strip()
try:
if isFirstLoop:
p1 = sub.Popen(shlex.split(now_cmd), stdout=PIPE)
exec_cmd(next_cmd,p1,False)
else:
p2 = sub.Popen(shlex.split(now_cmd),stdin=p.stdout, stdout=PIPE)
exec_cmd(next_cmd,p2,False)
except Exception as e:
print("Error executing command '{0}'.\nOutput:\n:{1}".format(cmd,str(e)))
exit()
# Adjust cmd to execute the next part
cmd = next_cmd
else:
proc = sub.Popen(shlex.split(cmd),stdin=p.stdout, stdout=PIPE, universal_newlines=True)
(out,err) = proc.communicate()
if err:
print(str(err).strip())
else:
print(out)
exec_cmd("ls -ltrh | awk '{print $9}' | wc -l ")