Persistant python sous-processus
Est-il un moyen de faire un sous-processus d'appel en python "persistante"? Je suis d'appeler un programme qui prend un certain temps à charger plusieurs fois. Donc, ce serait formidable si je pouvais quitter le programme de l'ouvrir et de communiquer avec lui sans le tuer.
Le dessin animé version de mon script python ressemble à ceci:
for text in textcollection:
myprocess = subprocess.Popen(["myexecutable"],
stdin = subprocess.PIPE, stdout = subprocess.PIPE,
stderr = None)
myoutputtext, err = myprocess.communicate(input=text)
J'ai besoin de traiter chaque texte séparément, afin de rejoindre tous en un seul gros fichier texte, puis de les traiter une fois n'est pas une option.
De préférence, si il y a une option de ce genre
myprocess = subprocess.Popen(["myexecutable"],
stdin = subprocess.PIPE, stdout = subprocess.PIPE,
stderr = None) for text in textcollection:
for text in textcollection:
myoutputtext, err = myprocess.communicate(input=text)
où je peux laisser ouvert le processus, j'apprécierais vraiment.
OriginalL'auteur JasonMond | 2012-01-23
Vous devez vous connecter pour publier un commentaire.
Vous pouvez utiliser
myprocess.stdin.write()
etmyprocess.stdout.read()
à communiquer avec votre sous-processus, vous avez juste besoin d'être prudent et assurez-vous de la poignée de mise en mémoire tampon correctement pour éviter que vos appels à partir de blocage.Si la sortie de votre sous-processus bien défini, vous devriez être en mesure de communiquer de manière fiable à l'aide de la ligne de mise en mémoire tampon et
myprocess.stdout.readline()
.Voici un exemple:
Une alternative à cette méthode pour Unix est de mettre le descripteur de fichier en mode sans blocage, ce qui vous permettra d'appeler des fonctions comme
myprocess.stdout.read()
et de l'avoir de retour de données si elle existe, ou de soulever uneIOError
si il n'y a pas toutes les données:Cela vous permettrait de faire quelque chose comme ceci:
Dans cet exemple,
validate_output()
est une fonction que vous auriez besoin d'écrire qui renvoieTrue
si les données que vous avez reçues jusqu'à présent sont tous de sortie que vous prévoyez d'obtenir.Pourquoi la baisse de vote?
C'était par erreur. Mon upvote est inactif jusqu'à ce que quelque chose va être édité, mais je ne vois rien à améliorer ou à ne pas faire de mal. Réponse parfaite.
pas de problème, merci pour la réponse 🙂 Juste fait une modification mineure.
OriginalL'auteur Andrew Clark
C'est l'appel à
communicate()
qui est en train de tuer votre sous-processus. Selon le sous-processus de la documentation lacommunicate()
méthode:Ce que vous voulez faire est d'interagir directement avec le
POpen
de l'objetstdin
etstdout
propriétés de communiquer directement avec les sous-processus. Toutefois, la documentation déconseille ce dicton:Donc, vous avez besoin pour mettre en œuvre vos propres solutions pour contourner les blocages potentiels, ou dans l'espoir que quelqu'un a écrit un asynchrone sous-processus module pour vous.
Edit: Voici un rapide n'dirty exemple de la façon asynchrone sous-processus module peut être utilisé:
Lorsque je l'exécute, il imprime:
OriginalL'auteur srgerg
Je pense que vous êtes à la recherche pour
vous pouvez créer une liste de Popens et ensuite appeler communiquer sur chaque élément dans une autre boucle.
quelque chose comme ceci
de cette façon, il n'aura pas à attendre jusqu'à ce que tous les Popens ont commencé
Je crois que je comprends. Après la saisie du texte, il affiche quelque chose et puis quitte? ou faut-il attendre pour vous de saisir quelque chose d'autre
Il génère ensuite des sorties.
OriginalL'auteur Ryan Haining
OriginalL'auteur imp