【发布时间】:2018-11-01 13:41:53
【问题描述】:
在我的python代码中,我编写了以下函数来接收来自标准输入的自定义二进制包。
def recvPkg():
## The first 4 bytes stands for the remaining package length
Len = int.from_bytes(sys.stdin.buffer.read(4), byteorder='big', signed=True)
## Then read the remaining package
data = json.loads(str(sys.stdin.buffer.read(Len), 'utf-8'))
## do something...
while True:
recvPkg()
然后,在另一个 Node.js 程序中,我将该 python 程序作为子进程生成,并向其发送字节。
childProcess = require('child_process').spawn('./python_code.py');
childProcess.stdin.write(someBinaryPackage)
我希望子进程在收到包后从其标准输入缓冲区中读取并给出输出。但它不起作用,我认为原因是子进程不会开始读取,除非它的标准输入缓冲区接收到一个信号,比如 EOF。作为证明,如果我在 stdin.write 之后关闭 childProcess 的 stdin,python 代码将工作并立即接收所有缓冲包。这不是我想要的方式,因为我需要打开 childProcess 的标准输入。那么node.js有没有其他方法可以向childProcess发送信号以通知从stdin缓冲区读取?
(抱歉英语不好。
【问题讨论】:
-
你确定
Len是正确的吗?sys.stdin.buffer.read(Len)将从标准输入读取字节,直到它收到Len字节。在那之前,这将是一个阻塞调用。所以.read(5)如果你发送它“abcd”将不会做任何事情,但是当你发送最后一个“e”时它会继续。如果Len包含确定消息长度的字节,则需要将数据加载更改为.read(Len-4)。 -
@alxwrd 感谢您的评论。我确信 python sys.stdin.buffer.read() 在某些刷新事件发生之前不会读取任何内容。确实,.read(5) 在仅收到“abcd”时不会读取,但这不是我的情况。我向 childProcess 发送长字节,如果我在 write() 之后添加“childProcess.stdin.end()”,则读取 python 代码。否则,它不会。我还尝试重定向来自文件的输入,并且它可以工作,因为我认为来自文件的流最终会有一个 EOF。