Je sais comment exécuter une commande à l'aide de cmd = Subprocess.Popen, puis sous-processus.communicate. La plupart du temps, j'utilise une chaîne togmentée avec SHLEX.Split comme argument "Argv" pour Popen. Exemple avec "LS -L":
import subprocess
import shlex
print subprocess.Popen(shlex.split(r'ls -l'), stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE).communicate()[0]
Cependant, les tuyaux semblent ne pas travailler ... Par exemple, l'exemple suivant revient en notant:
import subprocess
import shlex
print subprocess.Popen(shlex.split(r'ls -l | sed "s/a/b/g"'), stdin = subprocess.PIPE, stdout = subprocess.PIPE, stderr = subprocess.PIPE).communicate()[0]
Pouvez-vous me dire ce que je fais mal s'il vous plaît?
THX
Je pense que vous voulez instancier deux objets popen distincts ici, un pour 'LS' et l'autre pour "SED". Vous voudrez transmettre le premier objet de l'objet popen stdout
comme l'argument stdin
à l'objet 2nd popen.
Exemple:
p1 = subprocess.Popen('ls ...', stdout=subprocess.PIPE)
p2 = subprocess.Popen('sed ...', stdin=p1.stdout, stdout=subprocess.PIPE)
print p2.communicate()
Vous pouvez continuer à enchaîner cette façon si vous avez plus de commandes:
p3 = subprocess.Popen('prog', stdin=p2.stdout, ...)
Voir la Documentation sous-traduction Pour plus d'informations sur la façon de travailler avec des sous-processus.
J'ai fait une petite fonction pour aider avec la tuyauterie, espérons que cela aide. Il va chaîner la population au besoin.
from subprocess import Popen, PIPE
import shlex
def run(cmd):
"""Runs the given command locally and returns the output, err and exit_code."""
if "|" in cmd:
cmd_parts = cmd.split('|')
else:
cmd_parts = []
cmd_parts.append(cmd)
i = 0
p = {}
for cmd_part in cmd_parts:
cmd_part = cmd_part.strip()
if i == 0:
p[i]=Popen(shlex.split(cmd_part),stdin=None, stdout=PIPE, stderr=PIPE)
else:
p[i]=Popen(shlex.split(cmd_part),stdin=p[i-1].stdout, stdout=PIPE, stderr=PIPE)
i = i +1
(output, err) = p[i-1].communicate()
exit_code = p[0].wait()
return str(output), str(err), exit_code
output, err, exit_code = run("ls -lha /var/log | grep syslog | grep gz")
if exit_code != 0:
print "Output:"
print output
print "Error:"
print err
# Handle error here
else:
# Be happy :D
print output
"""
Why don't you use Shell
"""
def output_Shell(line):
try:
Shell_command = Popen(line, stdout=PIPE, stderr=PIPE, Shell=True)
except OSError:
return None
except ValueError:
return None
(output, err) = Shell_command.communicate()
Shell_command.wait()
if Shell_command.returncode != 0:
print "Shell command failed to execute"
return None
return str(output)