example - subprocess python español
¿Hay una versión tranquila de subprocess.call? (5)
A menudo, ese tipo de charla está en stderr, por lo que es posible que desee silenciar eso también. Aquí está mi ejemplo:
from subprocess import call, DEVNULL
return_code = call(args, stderr=DEVNULL, stdout=DEVNULL)
Nota: subprocess.DEVNULL
está disponible desde Python 3.3. Si todavía estás en Python 2:
import os
with open(os.devnull, ''w'') as shutup:
return_code = call(args, stdout=shutup, stderr=shutup)
¿Existe una variante de subprocess.call
que puede ejecutar el comando sin imprimir en la salida estándar, o una manera de bloquear sus mensajes de salida estándar?
Esta es una receta que uso mucho: llamar al subprocess
y recolectar la salida, y cuando el comando se ejecuta correctamente, descarte la salida, pero cuando falla, imprima la salida.
import subprocess as sp
import sys
if "print" in __builtins__.__dict__:
prn = __builtins__.__dict__["print"]
else:
def prn(*args, **kwargs):
"""
prn(value, ..., sep='' '', end=''//n'', file=sys.stdout)
Works just like the print function in Python 3.x but can be used in 2.x.
Prints the values to a stream, or to sys.stdout by default.
Optional keyword arguments:
file: a file-like object (stream); defaults to the current sys.stdout.
sep: string inserted between values, default a space.
end: string appended after the last value, default a newline.
"""
sep = kwargs.get("sep", '' '')
end = kwargs.get("end", ''/n'')
file = kwargs.get("file", sys.stdout)
s = sep.join(str(x) for x in args) + end
file.write(s)
def rc_run_cmd_basic(lst_cmd, verbose=False, silent=False):
if silent and verbose:
raise ValueError("cannot specify both verbose and silent as true")
p = sp.Popen(lst_cmd, stdin=sp.PIPE, stdout=sp.PIPE, stderr=sp.PIPE)
tup_output = p.communicate()
s_cmd = '' ''.join(lst_cmd)
if verbose:
prn()
prn("command: ''%s''/n" % s_cmd)
if 0 != p.returncode:
prn()
prn("Command failed with code %d:" % p.returncode)
else:
prn("Command succeeded! code %d" % p.returncode)
if verbose:
prn("Output for: " + s_cmd)
prn(tup_output[0])
prn()
if not silent and 0 != p.returncode:
prn("Error output for: " + s_cmd)
prn(tup_output[1])
prn()
return p.returncode
Sí. Redirige su stdout
a /dev/null
.
process = subprocess.call(["my", "command"], stdout=open(os.devnull, ''wb''))
Utilizo subprocess.check_output en tales casos y descarto el valor de retorno. Es posible que desee agregar un comentario a su código que indique por qué está usando check_output en lugar de check_call. check_output también es mejor cuando se produce un error y está interesado en la salida de error. Código de ejemplo a continuación. La salida solo se ve cuando se elimina el comentario de la línea de impresión. Si el comando falla, se lanza una excepción.
import subprocess
ret = subprocess.check_output(["cat", "/tmp/1"])
#print ret
subprocess.call
también acepta redirecciones stdin / stdout / stderr:
process = subprocess.call(["my", "command"], stdout=open(os.devnull, ''wb''))