web-dev-qa-db-fra.com

Comment simplement appeler une commande et ne pas obtenir sa sortie

En Python, quelle est la manière la plus courte et la plus standard d'appeler une commande via subprocess mais sans se soucier de sa sortie.

J'ai essayé subprocess.call mais il semble renvoyer la sortie. Cela ne me dérange pas, j'ai juste besoin d'exécuter le programme en silence sans que la sortie n'encombre l'écran.

Si cela aide, j'appelle pdflatex et mon intention est juste de l'appeler.

35
user225312
p = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE)
out, err = p.communicate()
# do something with out, err, or don't bother altogether.

Fondamentalement, cela "canalise" tout ce que cmd sort vers stdout et stderr vers des tampons en mémoire préparés par subprocess. Ce que vous faites avec le contenu de ces tampons dépend de vous. Vous pouvez les examiner ou ne pas vous en préoccuper complètement. Mais l'effet secondaire de la tuyauterie vers ces tampons est qu'ils ne seront pas imprimés sur le terminal.

edit : Cela fonctionne également avec la méthode pratique, call. Pour une démonstration:

>>> subprocess.call('ping 127.0.0.1')

Pinging 127.0.0.1 with 32 bytes of data:
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128
Reply from 127.0.0.1: bytes=32 time<1ms TTL=128

Ping statistics for 127.0.0.1:
    Packets: Sent = 4, Received = 4, Lost = 0 (0% loss),
Approximate round trip times in milli-seconds:
    Minimum = 0ms, Maximum = 0ms, Average = 0ms
0
>>> subprocess.call('ping 127.0.0.1', stdout=subprocess.PIPE)
0

edit-2 : Une note de prudence pour subprocess.call :

Remarque: N'utilisez pas stdout = PIPE ou stderr = PIPE avec cette fonction. Comme les canaux ne sont pas lus dans le processus en cours, le processus enfant peut se bloquer s'il génère suffisamment de sortie vers un canal pour remplir la mémoire tampon du canal OS.

37
Santa

Dans le cas où votre processus produit des quantités importantes de sortie que vous ne souhaitez pas mettre en mémoire tampon, vous devez rediriger la sortie vers la poubelle électronique:

with open(os.devnull, "w") as f:
    subprocess.call(["pdflatex", filename], stdout=f)

La variable os.devnull est le nom du périphérique nul de votre système d'exploitation (/dev/null sur la plupart des OS, nul sur l'autre).

51
Sven Marnach

Utilisez/dev/null si vous utilisez Unix. Si vous exécutez une commande dans Shell et que vous ne souhaitez pas afficher sa sortie sur le terminal.

Par exemple: - ls>/dev/null ne produira aucune sortie sur le terminal.

Il suffit donc d'utiliser os, sous-processus pour exécuter quelque chose sur Shell et de mettre son o/p dans/dev/null.

3
Subhankar Ghosal

il suffit de l'appeler comme vous êtes et de virer>/dev/null à la fin du comamnd. Cela redirigera toute sortie textuelle.

3
Tyler Eaves