Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Node.js和Python之间通过stdio进行通信时出现问题_Javascript_Python_Node.js_Coffeescript_Subprocess - Fatal编程技术网

Javascript Node.js和Python之间通过stdio进行通信时出现问题

Javascript Node.js和Python之间通过stdio进行通信时出现问题,javascript,python,node.js,coffeescript,subprocess,Javascript,Python,Node.js,Coffeescript,Subprocess,我正在从Python线程中生成一个节点进程,并通过stdio在它们之间传递数据。Python向Node发送内容后,Node启动一个子进程,然后将该子进程的输出发送回Python 这种方法可以工作几秒钟,然后就没有更多的数据了。但是,如果我终止了节点进程,那么突然所有的数据同时出现 我认为这与缓冲有关,但我已经尝试了很多方法,无法使其正常工作 值得一提的是,如果我在Python之外运行监视器,它工作得很好,因此这可能是Python方面的事情 相关Python代码: class MonitorThr

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

这种方法可以工作几秒钟,然后就没有更多的数据了。但是,如果我终止了节点进程,那么突然所有的数据同时出现

我认为这与缓冲有关,但我已经尝试了很多方法,无法使其正常工作

值得一提的是,如果我在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中,但即使您不知道,也会明白):

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

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'
  • 我已尝试在发送更多数据之前等待“drain”事件

您还应该传递
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()

更好的选择是使用。

输出似乎是缓冲的。这可能有助于防止缓冲:这似乎没有什么区别,实际上它加剧了问题。只有一行通过,而不是三行,当然,当进程现在被终止时(因为缺少缓冲),没有任何东西通过。似乎我仍然有stdio:“inherit”。删除它之后,我得到:EBADF-坏文件描述符。编辑:如果你站着跑,我明白了。如果从Python内部运行,则不会得到错误,但不会得到输出。
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()