¿Existe una variante de subprocess.call
que pueda ejecutar el comando sin imprimir a la salida estándar, o una forma de bloquear su salida estándar?¿Hay una versión silenciosa de subprocess.call?
Respuesta
Sí. Redirigir su stdout
al /dev/null
.
process = subprocess.call(["my", "command"], stdout=open(os.devnull, 'wb'))
'Popen' no es una variante de' call'. Es una función completamente diferente. – jwg
Tienes razón. Sin embargo, Popen y call tienen argumentos muy similares, por lo que estas soluciones funcionan para ambos. He enviado una edición. – jhrf
Tenga en cuenta que desde Python ver. 3.3 existe en realidad un 'subproceso.DEVNULL', que se puede usar en lugar de' open (os.devnull, 'wb') '. – EquipDev
A menudo ese tipo de chatter está en stderr, por lo que también querrá silenciarlo. 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 usted todavía está en Python 2:
import os
with open(os.devnull, 'w') as shutup:
return_code = call(args, stdout=shutup, stderr=shutup)
notando que no se necesita ninguna respuesta sobre el uso de 'startupinfo' como se muestra aquí: http://code.activestate.com/recipes/409002-launching-a-subprocess-without-a-console-window/ para evitar el parpadeo de la ventana cuando se ejecuta Python fuera de una consola –
python 3 ahora tiene 'subproceso.DEVNULL' (pero tu respuesta es 7 años) –
@ Jean-FrançoisFabre Esto ya fue mencionado en un comentario sobre la respuesta aceptada. De todos modos, lo he editado ahora, gracias por la sugerencia. – wim
subprocess.call
aceptan también redirecciones de la entrada estándar/stdout/stderr:
process = subprocess.call(["my", "command"], stdout=open(os.devnull, 'wb'))
[Los documentos] (http://docs.python.org/2/library/subprocess.html#subprocess.call) dicen específicamente "No use stdout = PIPE o stderr = PIPE con esta función". – mpen
open() no devuelve un PIPE, el PIPE significa 'subprocess.PIPE' que se puede leer desde el otro extremo del programa. Una apertura a 'os.devnull' no causará problemas porque no hay fondo en este archivo de agujero negro, el búfer nunca se va a llenar. – BOYPT
Ah. Eso tiene sentido. ¡Gracias! No quería tener que usar 'Popen' ya que devuelve un proceso en lugar de un código de estado. – mpen
Esta es una receta que utilizo mucho: llamar subprocess
y recoger la salida, y cuando el comando logra descartar la salida, pero cuando falla imprime 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
Utilizo subprocess.check_output en tales casos y elimino el valor de retorno. Es posible que desee agregar un comentario a su código que indique por qué está utilizando check_output en lugar de check_call. check_output también es más agradable cuando ocurre una falla y le interesa el resultado del error. Ejemplo de código a continuación. La salida se ve solo cuando descomenta 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
¿De qué manera la caída del valor de retorno impide que la salida sea stdout? – Emre
subprocess.check_output se supone que captura el resultado y lo devuelve. ¿Ves un comportamiento diferente? –
Capturar e ignorar funciona, pero desperdicia memoria en el valor capturado que luego nunca se usa. Descartar la salida correctamente es más robusto. – tripleee
- 1. subprocess.call env var
- 2. Python: subprocess.call tubería rota
- 3. python pip instalación silenciosa
- 4. Detección silenciosa de Sms android
- 5. NSIS - Aplicación de actualización automática silenciosa
- 6. Problema con subprocess.call
- 7. aplicación de subprocess.call con argumentos
- 8. ¿Hay una versión estándar, strided de memcpy?
- 9. ¿Hay una versión de wchar_t para asprintf?
- 10. ¿Hay una versión Scala de NavigableMap?
- 11. ¿Hay una versión de log4net para Silverlight?
- 12. ¿Hay una versión segura de strlen?
- 13. Impresión "silenciosa" en una aplicación web
- 14. php cURL opción silenciosa?
- 15. Python: subproceso.Popen y subprocess.call hang
- 16. Instalación silenciosa en dispositivos Android
- 17. Instalación silenciosa del complemento de firefox
- 18. ¿Hay alguna manera de instalar .NET de forma silenciosa o automática?
- 19. Manejo de directorios con espacios Python subprocess.call()
- 20. ¿Hay una versión de XCode de "Método de anulación/implementación"?
- 21. Python: ulimit y agradable para subprocess.call/subprocess.Popen?
- 22. ¿Hay una versión objetivo-c/iPhone de currentTimeMillis() de Java?
- 23. ¿Hay una versión mobi de la especificación de lenguaje Java?
- 24. Impresión silenciosa de un PDF en Python
- 25. Impresión silenciosa de PDF desde Java
- 26. Impresión silenciosa de un PDF incrustado
- 27. ¿Hay una versión de la mónada 'andand' para Objective-C?
- 28. ¿Hay una versión de ELMAH para .NET 4?
- 29. ¿Por qué no hay una versión genérica de HybridDictionary?
- 30. ¿Hay una versión no instalable de Fiddler, o equivalente?
Estrechamente relacionado http://stackoverflow.com/questions/5495078/how-do-you-discard-subprocess-output-in-python, en particular debido llamada utiliza Popen. –
relacionado: [Cómo ocultar la salida del subproceso en Python 2.7] (http://stackoverflow.com/q/11269575/4279) – jfs