2011-05-18 5 views
6

Section 17.1.4.2: Replacing shell pipeline du module subprocess python dit pour remplacerExpliquer par exemple du module subprocess python

output=`dmesg | grep hda` 

avec

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] 

Le commentaire à la troisième ligne explique pourquoi la fonction de fermeture est appelée, mais pas pourquoi cela a du sens. Cela ne me concerne pas. La fermeture de p1.stdout avant l'appel de la méthode de communication n'empêche-t-elle pas d'envoyer une sortie via le canal? (Evidemment ça ne marchera pas, j'ai essayé de lancer le code et ça marche bien). Pourquoi est-il nécessaire d'appeler à proximité pour que p1 reçoive SIGPIPE? Quel genre de proche est-ce qui ne ferme pas? Quoi, exactement, est-ce qu'il se ferme?

Veuillez considérer ceci comme une question académique, je n'essaie pas d'accomplir quoi que ce soit si ce n'est de mieux comprendre ces choses.

+0

stdin et stdout sont des fichiers. Donc vous êtes censé les fermer pour libérer le tuyau. – JBernardo

Répondre

10

Vous fermez p1.stdout dans le processus parent, laissant ainsi dmesg comme seul processus avec ce descripteur de fichier ouvert. Si vous ne l'avez pas fait, même si dmesg a fermé sa sortie standard, vous l'auriez toujours ouvert et un SIGPIPE ne serait pas généré. (Le système d'exploitation conserve essentiellement un nombre de références et génère SIGPIPE lorsqu'il atteint zéro Si vous ne fermez pas le fichier, vous l'empêchez d'atteindre zéro.)

Questions connexes