我正在尝试测试一个有点简单的node.js到非阻塞的python管道。
到目前为止,我有以下代码
在test.js中:
for(var i = 0; i < 100; i++)
console.log("hello");
process.exit(0);
在test.py中:
import sys
from subprocess import Popen, PIPE
from threading import Thread
from Queue import Queue, Empty
def enqueue_output(out, queue):
while True:
lines = out.readline()
out.flush()
queue.put(lines)
process = Popen("node test.js", stdout=PIPE)
queue = Queue()
thread = Thread(target=enqueue_output, args=(process.stdout, queue))
thread.daemon = True # kill all on exit
thread.start()
while True:
try:
char = queue.get_nowait()
except Empty:
continue # do stuff
else:
sys.stdout.write(char)
我希望程序简单地输出你好100次,管道。但我没有输出(运行为:)
> python test.py
答案 0 :(得分:0)
你需要修改行
process = Popen("node test.js", stdout=PIPE)
为:
process = Popen(['/usr/local/bin/node', 'test.js'], stdout=PIPE)
答案 1 :(得分:0)
删除process.exit(0)
。这导致进程在对stdout的写入有机会完成之前退出,因为当stdout是管道而不是tty时,写入在* nix上是异步的。几乎不需要调用process.exit()
,因为该过程应该自然结束,0是默认的退出状态代码。
最近更新了documentation for process.stdout
/process.stderr
,以描述这些流同步或异步的情况。