Je voulais utiliser un python équivalent pour avoir des commandes de shell dans Perl. Quelque chose comme la version Python de Open (tuyau, "Command |").
Je vais au module de sous-processus et essayez ceci: p> Ceci fonctionne pour lire la sortie De la même manière que je voudrais au Perl, mais cela ne se nettoie pas. Lorsque je sompre l'interprète, j'obtiens p> sensibilisé sur STDERR quelques millions de fois. Je suppose que j'avais naïvement espéré tout cela serait pris en charge pour moi, mais ce n'est pas vrai. Appeler terminer ou tuer sur P ne semble pas aider. Regardez la table de processus, je vois que cela tue le processus / bin / sh, mais laisse le gzip enfant en place pour se plaindre de la tuyau cassée. P> Quelle est la bonne façon de faire cela? P > p>
4 Réponses :
Comment avez-vous exécuté ce processus?
La manière appropriée est d'utiliser P>
p.communicate()
Cela se produit même si je ne communique jamais avec le processus. Il suffit de créer l'objet p et puis de la sortie de l'interprète provoque ce problème.
Oui, si je me souviens bien, Popen exécute la commande. Communiquer () CODE> Attend alors que le processus soit terminé, les tampons sont rincé, etc., etc. Voir également
check_call () code>.
Après avoir ouvert le tuyau, vous pouvez travailler avec la sortie de commande: p.stdout code>:
Vous devez attendre code> pour le processus de finition:
import subprocess
p = subprocess.Popen("cat /mach_kernel", shell=True,
stdout=subprocess.PIPE, stderr=subprocess.PIPE)
stdout, stderr = p.communicate()
Le problème est que le tuyau http://docs.python.org/library/subprocess. html # subprocess.popen.wait p>
blockQquote> http://docs.python.org/library/subprocess. html # subprocess.popen.communica p>
blockQuote> http://docs.python.org/library/subprocess. html # subprocess.popen.stdout p>
blockQuote> La morale de l'histoire est, pour une sortie importante, Les documents suggèrent de remplacer un tuyau d'obus avec ceci: p> avis que Quoi qu'il en soit, si cette dernière partie ne fonctionne pas pour vous ( devrait em>, cependant), vous pouvez essayer de créer un fichier temporaire, écrivez toutes les données du premier appel à cela, puis en utilisant le fichier temporaire en tant que saisie du processus suivant. P> P> p > code> est plein. La sous-traitement s'arrête, attendant que le tuyau soit vide, mais votre processus (l'interpréteur de python) se cessa, brisant son extrémité du tuyau (d'où le message d'erreur).
p.wait () code > Ne vous aidera pas: P>
communiquer () code> pour éviter cela. P>
p.communicate () code> ne vous aidera pas: P>
p.stdout.read (num_bytes) code> ne vous aidera pas: P>
COMMUNIQUE () CODE> plutôt que
.STDIN.WRITE CODE>,
.STDOUT.READ CODE> ou
ou
ou
.sderr.read code> Pour éviter les blocages en raison de l'un des autres tampons de tuyau d'exploitation remplissant et de bloquer le processus d'enfant. P>
subprocess.pipe code> vous deviendra à certains échec si votre programme tente de lire les données (il me semble que vous devrait être capable de mettre
p.stdout.read (octets) code> dans un
tandis que p.returncode n'est aucun: code> boucle, mais l'avertissement ci-dessus suggère que cela pourrait une impasse). < / p>
p2 code> prend son entrée standard directement à partir de
P1 code>. Ceci devrait em> éviter les blocages, mais compte tenu des avertissements contradictoires ci-dessus, qui sait p>
Soignez-vous l'interprète avant que votre sous-processus
p code> a fini?