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.
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.
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).
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.
il suffit de l'appeler comme vous êtes et de virer>/dev/null à la fin du comamnd. Cela redirigera toute sortie textuelle.