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 processo
  • p.stdout file corrispondente allo standard output del processo
  • p.stderr file corrispondente allo standard error del processo
  • p.pid process id del processo
  • p.returncode stato di uscita del processo, o None se il processo non è ancora uscito
  • p.poll() controlla se il processo è uscito; restituisce p.returncode
  • p.wait() aspetta finché il processo non termina; restituisce p.returncode
  • stdout, 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

Link