Je veux exécuter un programme C en utilisant subprocess.Popen() et le diffuser en sortie en temps réel et l'envoyer au client. Cependant, la sortie est mise en mémoire tampon et envoyée ensemble à la fin de l'exécution (nature bloquante). Comment puis-je recevoir la sortie en temps réel, puis l'envoyer immédiatement dans Twisted Autobahn.Comment diffuser la sortie en temps réel dans le serveur Twisted [autobahn] websocket?
def onConnect(self, request):
try:
self.cont_name = ''.join(random.choice(string.lowercase) for i in range(5))
self.file_name = self.cont_name
print("Connecting...")
except Exception:
print("Failed"+str(Exception))
def onOpen(self):
try:
print("open")
except Exception:
print("Couldn't create container")
def onMessage(self, payload,isBinary=False):
cmd = "docker exec "+self.cont_name+" /tmp/./"+self.file_name
a = subprocess.Popen([cmd], shell=True, stdout=subprocess.PIPE, bufsize=1)
for line in iter(a.stdout.readline, b''):
line = line.encode('utf8')
self.sendMessage(line)
def onClose(self, wasClean, code, reason):
try:
print("Closed container...")
except Exception:
print(str(Exception))
Lorsque la commande de menu fixe est exécutée en utilisant le sous-processus, la sortie entière du code c est renvoyée à la fois, plutôt que, comme il arrive. Ex:
#include <stdio.h>
#include <unistd.h>
int main(){
int i=0;
for(i=0;i<5;i++){
fflush(stdout);
printf("Rounded\n");
sleep(3);
}
}
Après avoir exécuté ce dans le récipient, le programme doit retourner « Arrondi » après 3 secondes au client. Cependant, il finit par envoyer tous les "arrondis" à la fin de l'exécution.
Votre question est globalement logique mais * si * largement que ce n'est pas vraiment clair où le problème que vous rencontrez est ou quelle suggestion vous aiderait à le dépasser. Pouvez-vous inclure un exemple de code? De préférence, quelque chose comme http://sscce.org/. –
@ Jean-PaulCalderone J'ai ajouté du code. S'il vous plaît, jetez un coup d'oeil. Merci –