Vous pouvez faire cela très facilement dans Twisted. En fonction de votre code existant, cela peut ne pas être si simple à utiliser, mais si vous construisez une application Twisted, des choses comme celles-ci deviennent presque triviales. Vous créez une classe ProcessProtocol
, et remplacez la méthode outReceived()
. Twisted (en fonction du réacteur utilisé) n'est généralement qu'une grande boucle select()
avec des rappels installés pour gérer les données provenant de différents descripteurs de fichiers (souvent des sockets réseau). Ainsi, la méthode outReceived()
consiste simplement à installer un rappel pour gérer les données provenant de STDOUT
. Un exemple simple démontrant ce comportement est le suivant :
from twisted.internet import protocol, reactor
class MyProcessProtocol(protocol.ProcessProtocol):
def outReceived(self, data):
print data
proc = MyProcessProtocol()
reactor.spawnProcess(proc, './myprogram', ['./myprogram', 'arg1', 'arg2', 'arg3'])
reactor.run()
La documentation Twisted contient des informations intéressantes à ce sujet.
Si vous construisez toute votre application autour de Twisted, cela rend la communication asynchrone avec d'autres processus, locaux ou distants, vraiment élégante comme ceci. En revanche, si votre programme n'est pas construit sur Twisted, cela ne sera pas vraiment utile. Espérons que cela puisse être utile à d'autres lecteurs, même si ce n'est pas applicable à votre application particulière.
16 votes
(Vient de Google?) tous les tuyaux se bloqueront lorsque le tampon de l'un des tuyaux sera rempli et non lu. par exemple, le blocage stdout lorsque stderr est rempli. Ne transmettez jamais un tuyau que vous n'avez pas l'intention de lire.
1 votes
@NasserAl-Wohaibi est-ce que cela signifie qu'il est préférable de toujours créer des fichiers alors ?
1 votes
Quelque chose qui me rend curieux de comprendre est pourquoi cela bloque en premier lieu...Je demande parce que j'ai vu le commentaire:
Pour éviter les interblocages: faites attention à: ajouter \n à la sortie, vider la sortie, utiliser readline() plutôt que read()
1 votes
C'est, "par conception", en attente de recevoir des saisies.
0 votes
Lié: stackoverflow.com/q/19880190/240515
6 votes
Incroyable que 12 ans plus tard cela ne fasse pas partie de Python lui-même :(