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