2011-09-12 12 views
11

Ecco quello che posso leggere nella documentazione del modulo python sottoprocesso:chiusura stdout di filodiffusione pitone sottoprocesso

Replacing shell pipeline 

    output=`dmesg | grep hda` 
    ==> 
    p1 = Popen(["dmesg"], stdout=PIPE) 
    p2 = Popen(["grep", "hda"], stdin=p1.stdout, stdout=PIPE) 
    p1.stdout.close() # Allow p1 to receive a SIGPIPE if p2 exits. 
    output = p2.communicate()[0] 

The p1.stdout.close() call after starting the p2 is important in order for p1 
to receive a SIGPIPE if p2 exits before p1. 

Io in realtà non capisco perché dobbiamo chiudere p1.stdout dopo aver creato p2. Quando viene eseguito esattamente il p1.stdout.close()? Cosa succede quando p2 non finisce mai? Cosa succede quando né p1 o p2 terminano?

risposta

13

Da Wikipedia, SIGPIPE è il segnale inviato a un processo quando tenta di scrivere su una pipe senza un processo collegato all'altra estremità.

prima volta che si crea utilizzando p1stdout=PIPE, c'è un processo collegato al tubo, che è il processo di Python, e si può leggere l'output utilizzando p1.stdout.

Quando si crea p2 utilizzando stdin=p1.stdout, ora ci sono due processi connessi alla conduttura p1.stdout.

Generalmente quando si eseguono processi in una pipeline si desidera che tutti i processi finiscano quando termina uno dei processi. Perché ciò avvenga automaticamente è necessario chiudere p1.stdout quindi p2.stdin è l'unico processo collegato a quella pipe, in questo modo se p2 termina e p1 scrive dati aggiuntivi su stdout, riceverà SIGPIPE poiché non ci sono più processi collegati a quella pipe .

1

OK Capisco. p1.stdout è chiuso dal mio script python ma rimane aperto in p2, quindi p1 e p2 comunicano insieme. Tranne se p2 è già chiuso, quindi p1 riceve un SIGPIPE. Sono corretto?

+0

Ciò è corretto, questo è importante se il primo processo potrebbe essere eseguito molto più a lungo del secondo processo. –

Problemi correlati