我想使用subprocess.Popen()來執行一個C程序,並實時輸出它的輸出並將它發送給客戶端。但是,輸出緩衝並在執行結束時一起發送(Blocking性質)。我怎樣才能實時接收輸出,然後立即將其發送到Twisted Autobahn中。如何在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))
當使用子過程執行該命令搬運工,C代碼的整個輸出在一次,而不是因爲它發生返回。對於前:
#include <stdio.h>
#include <unistd.h>
int main(){
int i=0;
for(i=0;i<5;i++){
fflush(stdout);
printf("Rounded\n");
sleep(3);
}
}
在容器中運行之後,程序應該在3秒到客戶端返回「四捨五入」。然而,它最終會在執行結束時發送所有'Rounded'。
你的問題廣義上講是有道理的,但是*廣泛地說,它不是很清楚你遇到的問題在哪裏,或者有什麼建議可以幫助你克服它。你可以包含一些示例代碼嗎?最好按照http://sscce.org/的說法。 –
@ Jean-PaulCalderone我添加了一些代碼。請確認一下。謝謝 –