Python os.system sin salida
subprocess (4)
Estoy ejecutando esto:
os.system("/etc/init.d/apache2 restart")
Reinicia el servidor web, como debería, y como lo haría si hubiera ejecutado el comando directamente desde el terminal, genera este:
* Restarting web server apache2 ...
waiting [ OK ]
Sin embargo, no quiero que salga en mi aplicación. ¿Cómo puedo desactivarlo? ¡Gracias!
Aquí hay una función de llamada al sistema que junté hace varios años y que he usado en varios proyectos. Si no desea ninguna salida del comando, simplemente puede decir out = syscmd(command)
y luego no hacer nada sin out
.
Probado y funciona en Python 2.7.12 y 3.5.2.
def syscmd(cmd, encoding=''''):
"""
Runs a command on the system, waits for the command to finish, and then
returns the text output of the command. If the command produces no text
output, the command''s return code will be returned instead.
"""
p = Popen(cmd, shell=True, stdin=PIPE, stdout=PIPE, stderr=STDOUT,
close_fds=True)
p.wait()
output = p.stdout.read()
if len(output) > 1:
if encoding: return output.decode(encoding)
else: return output
return p.returncode
Debe utilizar el módulo de subprocess
mediante el cual puede controlar el stdout
y el stderr
de una manera flexible. os.system
está en desuso.
El módulo de subprocess
permite crear un objeto que representa un proceso externo en ejecución. Puedes leerlo desde su stdout / stderr, escribir en su stdin, enviar señales, terminarlo, etc. El objeto principal en el módulo es Popen
. Hay un montón de otros métodos de conveniencia como la llamada, etc. Los docs son muy completos e incluyen una sección sobre os.system
reemplazar las funciones más antiguas (incluido os.system
) .
Dependiendo de su sistema operativo (y es por eso que, como dijo Noufal, debería usar subproceso) puede intentar algo como
os.system("/etc/init.d/apache restart > /dev/null")
o (silenciar también el error)
os.system("/etc/init.d/apache restart > /dev/null 2>&1")
Evite os.system()
por todos los medios, y use subproceso en su lugar:
with open(os.devnull, ''wb'') as devnull:
subprocess.check_call([''/etc/init.d/apache2'', ''restart''], stdout=devnull, stderr=subprocess.STDOUT)
Este es el equivalente de subprocess
de /etc/init.d/apache2 restart &> /dev/null
.
Hay subprocess.DEVNULL
en Python 3.3+ :
#!/usr/bin/env python3
from subprocess import DEVNULL, STDOUT, check_call
check_call([''/etc/init.d/apache2'', ''restart''], stdout=DEVNULL, stderr=STDOUT)