web-dev-qa-db-fra.com

Python os.system sans la sortie

Je cours ceci:

os.system("/etc/init.d/Apache2 restart")

Il redémarre le serveur Web, comme il se doit, et comme si j’avais exécuté la commande directement à partir du terminal, il génère ceci:

* Restarting web server Apache2 ...waiting [ OK ]

Cependant, je ne veux pas qu'il le produise réellement dans mon application. Comment puis-je le désactiver? Merci!

17
user697108

Évitez os.system() par tous les moyens et utilisez plutôt un sous-processus:

with open(os.devnull, 'wb') as devnull:
    subprocess.check_call(['/etc/init.d/Apache2', 'restart'], stdout=devnull, stderr=subprocess.STDOUT)

Ceci est l'équivalent subprocess du /etc/init.d/Apache2 restart &> /dev/null.

Il y a subprocess.DEVNULL sur 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)
32
lunaryorn

Vous devez utiliser le module subprocess avec lequel vous pouvez contrôler les stdout et stderr de manière flexible. os.system est obsolète. 

Le module subprocess vous permet de créer un objet qui représente un processus externe en cours d'exécution. Vous pouvez le lire depuis stdout/stderr, écrire dans son stdin, lui envoyer des signaux, le terminer, etc. L'objet principal du module est Popen. Il existe de nombreuses autres méthodes pratiques comme les appels, etc. Les docs sont très complètes et incluent une section sur le remplacement des anciennes fonctions (y compris os.system)

21
Noufal Ibrahim

En fonction de votre système d'exploitation (et c'est pourquoi, comme l'a dit Noufal, vous devriez plutôt utiliser un sous-processus), vous pouvez essayer quelque chose comme:

 os.system("/etc/init.d/Apache restart > /dev/null")

ou (pour couper aussi l'erreur)

os.system("/etc/init.d/Apache restart > /dev/null 2>&1")
19
mb14

Voici une fonction d’appel système que j’ai reconstituée il ya plusieurs années et que j’ai utilisée dans divers projets. Si vous ne voulez aucune sortie de la commande, vous pouvez simplement dire out = syscmd(command) et ne rien faire avec out.

Testé et fonctionne en Python 2.7.12 et 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
0
jdgregson