Python versione Bignami - Confronti
import subprocess
Lanciare un processo figlio
Modo completo:
p = subprocess.Popen(
# Comando da eseguire (come stringa o come lista)
args,
# How to connect the child's stdin, stdout and stderr:
# * None: eredita dal padre
# * subprocess.PIPE: collega via pipe all'oggetto file corrispondente
# p.stdin, p.stdout o p.stderr
# * subprocess.STDOUT: valido solo per stderr, collega stderr alla stesso
# modo di stdout
# * un oggetto di tipo file: collega via pipe al file dato
stdin=None,
stdout=None,
stderr=None,
# Se è True, esegue il comando usando la shell
shell=False,
# Directory in cui eseguire il comando (se None, usa la directory corrente)
cwd=None,
# Variabili di ambiente per il comando (se None, usa l'ambiente corrente)
env=None)
Modi rapidi:
res = subprocess.call(stessi parametri di Popen)esegue il comando e restituisce lo stato di uscita.subprocess.check_call(stessi parametri di Popen)esegue il comando e lancia CalledProcessError se lo stato di uscita non è zero.
Gli oggetti Popen
p.stdinfile corrispondente allo standard input del processop.stdoutfile corrispondente allo standard output del processop.stderrfile corrispondente allo standard error del processop.pidprocess id del processop.returncodestato di uscita del processo, o None se il processo non è ancora uscitop.poll()controlla se il processo è uscito; restituisce p.returncodep.wait()aspetta finché il processo non termina; restituisce p.returncodestdout, stderr = p.communicate(input=None)manda l'input al processo e ne legge lo standard output e standard error, finché il processo non finisce.
Esempi
from subprocess import *
# Legge un file dalla rete tramite wget e lo stampa mettendo i numeri alle
# righe
p = Popen(['wget', '-O-', '-q', url], stdout=PIPE)
for num, line in enumerate(p.stdout):
print "%4d %s" % (num, line[:-1])
if p.wait() != 0:
raise CalledProcessError