Comment puis-je savoir pourquoi subprocess.Popen wait () attend indéfiniment si stdout = PIPE?

StackOverflow https://stackoverflow.com/questions/1445627

  •  22-07-2019
  •  | 
  •  

Question

J'ai un programme qui écrit sur stdout et éventuellement stderr. Je veux l'exécuter à partir de python, en capturant les commandes stdout et stderr. Mon code ressemble à:

from subprocess import *

p = Popen( exe, shell=TRUE, stdout=PIPE, stderr=PIPE )
rtrncode = p.wait()

Pour quelques programmes, cela fonctionne bien, mais lorsque j’en ai ajouté un nouveau, celui-ci est définitivement bloqué. Si je supprime stdout = PIPE , le programme écrit sa sortie sur la console et se termine et tout va bien. Comment puis-je déterminer la cause du blocage?

Utilisation de Python 2.5 sous Windows XP. Le programme ne lit pas à partir de stdin et n’a aucune sorte de saisie de l’utilisateur (c’est-à-dire "appuyez sur une touche").

Était-ce utile?

La solution

Lorsque la mémoire tampon d'un canal est pleine (généralement environ 4 Ko), le processus d'écriture s'arrête jusqu'à ce qu'un processus de lecture ait lu certaines des données en question. mais ici vous ne lisez rien jusqu'à ce que le sous-processus soit terminé, d'où l'impasse. Les documents sur wait très clairement en effet:

  

Avertissement : le blocage sera bloqué si le   le processus enfant génère suffisamment de sortie   à un tuyau stdout ou stderr tel que   il bloque l'attente du tuyau OS   tampon pour accepter plus de données. Utilisation   communiquez () pour éviter cela.

Si vous ne pouvez pas utiliser communicez pour une raison quelconque, faites en sorte que le sous-processus écrive dans un fichier temporaire, puis vous pouvez attendre et lire ce fichier lorsqu'il est prêt - - l'écriture dans un fichier, au lieu d'un tuyau, ne risque pas de blocage.

Autres conseils

Consultez les docs . Il indique que vous ne devez pas utiliser wait car cela peut entraîner un blocage total. Essayez d’utiliser communiquez .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top