将node.js管道化为python

时间:2017-03-06 17:09:35

标签: javascript python node.js subprocess

我正在尝试测试一个有点简单的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

2 个答案:

答案 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,以描述这些流同步或异步的情况。