通过stdio在Node.js和Python之间进行通信的问题

时间:2012-07-26 13:03:23

标签: javascript python node.js coffeescript subprocess

我从Python线程中生成一个Node进程,并通过stdio在它们之间传递数据。在Python向Node发送内容之后,Node会触发一个子进程,然后将该子进程的输出发送回Python。

这可以工作几秒钟,然后就不再有数据了。但是,如果我终止了Node进程,那么突然所有数据都会立即出现。

我觉得这与缓冲有关,但是我尝试了很多东西而无法让它正常工作。

值得一提的是,如果我在Python之外运行监视器它可以正常工作,所以这可能是Python方面的东西。

相关的Python代码:

class MonitorThread(Thread):
    # *snip*

    def run(self):
        self.process = Popen(['node',
            path.join(PACKAGE_PATH 'monitor.js')],
            stdout=PIPE, stdin=PIPE, stderr=PIPE)

        while self.process.poll() is None:
            stdout = self.process.stdout.readline().rstrip('\n')

            if stdout:
                main_thread(debug, stdout)

            stderr = self.process.stderr.readline().rstrip('\n')

            if stderr:
                main_thread(debug, stderr)

            #time.sleep(0.1)

相关的Node.js代码(在CoffeeScript中,但即使你不知道它,你也明白了):

# *snip*

child = spawn cmd, options

child.stdout.on 'data', (data) ->
    process.stdout.write "stdout: #{data.toString().trim()}\n"

child.stderr.on 'data', (data) ->
    process.stdout.write "stderr: #{data.toString().trim()}\n"

还有很多其他代码,但它并不真正相关,数据正在发送,然后数据被接收,只是片刻。它仍在运行,因为当我手动杀死它时,其余的数据突然出现。

Monitor [send] - {"wrap": false, "directories": {"src": "lib"}, "id": 0, "base_dir": "C:\\Users\\Joe\\Documents\\GitHub\\CoffeeScript-Sublime-Plugin"}
Monitor [recv] - 13:55:30 - compiled src\a.coffee
Monitor [recv] - path.exists is now called `fs.exists`.
Monitor [recv] - 13:55:30 - compiled src\b.coffee
  • 我尝试过util.pump()
  • 我尝试过,使用spawn()调用,stdio:'inherit'
  • 在发送更多数据之前,我已经尝试等待“排水”事件。

1 个答案:

答案 0 :(得分:0)

您还应该传递end事件来关闭流并让节点刷新它们:

child = spawn cmd, options

child.stdout.pipe(process.stdout)
child.stderr.pipe(process.stdout)

child.stdout.on 'data', (data) ->
    process.stdout.write "stdout: #{data.toString().trim()}\n"

child.stdout.on 'end', () ->
    process.stdout.end()

child.stderr.on 'end', () ->
    process.stdout.end()

更好的选择是使用Stream.pipe()