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!
É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)
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
) .
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")
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