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.stdin
file corrispondente allo standard input del processop.stdout
file corrispondente allo standard output del processop.stderr
file corrispondente allo standard error del processop.pid
process id del processop.returncode
stato 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