python subprocess os.system

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)