programa - Suprime la salida en llamadas de Python a ejecutables
instalar py2exe (9)
Como menciona el sistema os.system (), use el módulo de subproceso y, si lo desea, establezca stdout = open (os.devnull, ''w'') (y tal vez lo mismo para stderr) cuando abra el subproceso.
Tengo un binario llamado A
que genera salida cuando se llama. Si lo llamo desde un shell Bash, la mayoría de los resultados son suprimidos por A > /dev/null
. Toda la salida es suprimida por A &> /dev/null
Tengo un script de Python llamado B
que necesita llamar a A
Quiero poder generar salida desde B
, mientras suprimo todo el resultado de A
Desde dentro de B
, probé os.system(''A'')
, os.system(''A > /dev/null'')
y os.system(''A &> /dev/null'')
, os.execvp(''...'')
, etc., pero ninguno de ellos suprime todo el resultado de A.
Podría ejecutar B &> /dev/null
, pero eso también suprime toda la salida de B
y no quiero eso.
Alguien tiene sugerencias?
En Python 3.3 y subprocess
posteriores, el subprocess
admite una opción para redirigir a /dev/null
. Para usarlo, cuando llame a .Popen
y sus amigos, especifique stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL,
como argumentos de palabra clave.
Así que la respuesta de DNS, reescrita para Python 3.3+, se convierte
import subprocess
command = ["executable", "argument_1", "argument_2"]
result = subprocess.call(command,
stdout=subprocess.DEVNULL,
stderr=subprocess.DEVNULL)
De la documentación:
subproceso.DEVNULL¶
Valor especial que se puede usar como argumento stdin, stdout o stderr para Popen e indica que se usará el archivo especial os.devnull.
Nuevo en la versión 3.3.
Para Python 3.0 a 3.2, tiene que abrir manualmente el dispositivo nulo usando open(os.devnull)
, como escribió DNS.
Sé que es tarde para el juego, pero ¿por qué no simplemente redirigir la salida a / dev / null desde dentro de os.system? P.ej:
tgt_file = "./bogus.txt"
os.sytem("d2u ''%s'' &> /dev/null" % tgt_file)
Esto parece funcionar para aquellas ocasiones en las que no desea tratar el subproceso.STDOUT.
Si necesita simplemente capturar STDOUT, no asignarlo a una variable, ¿lo hace? Por ejemplo:
megabyte=''''
# Create a 1 MiB string of NULL characters.
for i in range(1048576):
megabyte += ''/0''
fh=open(''zero.bin'',''w'')
# Write an 8 GiB file.
for i in range(8192):
print(i)
# Suppress output of ''write()'' by assigning to a variable.
discard=fh.write(megabyte)
fh.close()
Estaba creando un gran archivo lleno de cero en cero espacio libre en mi disco duro y descubrí que cada llamada a handle.write (string) escupía la cantidad de bytes escritos. Asignarlo a un vairable suprimió esa salida.
Si no desea esperar a que se complete el comando, como iniciar una tarea de respaldo, otra opción es pasarla por bash, lo que permite que la redirección funcione normalmente.
Por ejemplo, iniciar un archivo de sonido usando aplay:
import os
def PlaySound(filename):
command = ''bash -c "aplay %s &> /dev/null &"'' % (filename)
os.system(command)
De esta forma puedo generar un nuevo proceso, no esperar a que termine y evitar que imprima en la terminal. El único inconveniente es que cargará una instancia de bash así como el proceso que está ejecutando, proporcionando una ligera sobrecarga.
Si su motor de búsqueda lo lleva a esta vieja pregunta (como yo), tenga en cuenta que el uso de PIPE puede provocar bloqueos . De hecho, debido a que las tuberías están almacenadas en búfer, puede escribir una cierta cantidad de bytes en una tubería, incluso si nadie la leyó. Sin embargo, el tamaño del buffer es finito. Y, en consecuencia, si su programa A tiene una salida mayor que el búfer, A se bloqueará al escribir, mientras que el programa que llama B espera la terminación de A. Pero no, en este caso particular ... vea los comentarios a continuación.
Aún así, recomiendo usar la solución de Devin Jeanpierre y DNS.
Si tiene Python 2.4, puede usar el módulo de subproceso :
>>> import subprocess
>>> s = subprocess.Popen([''cowsay'', ''hello''], /
stderr=subprocess.STDOUT, stdout=subprocess.PIPE).communicate()[0]
>>> print s
_______
< hello >
-------
/ ^__^
/ (oo)/_______
(__)/ )///
||----w |
|| ||
Yo suelo:
call(command, stderr=subprocess.PIPE, stdout=subprocess.PIPE)
donde comando es la cadena del comando + argumentos
Para que esto funcione, debe importar el subproceso
import os
import subprocess
command = ["executable", "argument_1", "argument_2"]
with open(os.devnull, "w") as fnull:
result = subprocess.call(command, stdout = fnull, stderr = fnull)
Si el comando no tiene ningún argumento, puede proporcionarlo como una cadena simple.
Si su comando se basa en funciones de shell como comodines, derivaciones o variables de entorno, deberá proporcionar el comando completo como una cadena y también especificar shell = True
. Sin embargo, esto debe evitarse, ya que representa un riesgo para la seguridad si el contenido de la cadena no se valida con cuidado.