如何从节点1与python3程序交互通信?
我有以下“bot”python脚本:如何从节点1与python3程序交互通信?,python,node.js,pipe,python-3.5,Python,Node.js,Pipe,Python 3.5,我有以下“bot”python脚本: #! /usr/bin/env python3 import asyncio import sys def callback(*args): data = sys.stdin.readline()[:-1] print('ECHO: {}'.format(data), flush=True) if data == 'EOF': loop.stop() print('Bot spawning!') loop = a
#! /usr/bin/env python3
import asyncio
import sys
def callback(*args):
data = sys.stdin.readline()[:-1]
print('ECHO: {}'.format(data), flush=True)
if data == 'EOF':
loop.stop()
print('Bot spawning!')
loop = asyncio.get_event_loop()
task = loop.add_reader(sys.stdin.fileno(), callback)
loop.run_forever()
loop.close()
print('Bot dead')
应由此节点应用程序处理的:
#! /usr/bin/env node
const createInterface = require('readline').createInterface
const spawn = require('child_process').spawn
const lines = [
'I',
'LOVE',
'DEAD',
'BEEF',
'EOF',
]
const bot = spawn('./poc.py')
const rl = createInterface({
input: bot.stdout,
})
rl.on('line', line => {
console.log('BOT SAYS', new Array(line))
})
// bot.stdout.on('data', data => {
// console.log(`BOT SAYS: ${data}`)
// })
bot.stdin.on('error', (err) => console.log(err))
try {
console.log('Dispatching lines...')
lines.forEach( line => {
console.log('Connected', bot.connected)
console.log('Sending', line)
bot.stdin.write(`${line}\n`)
})
}
finally {
// bot.stdin.end()
}
问题是,除非我取消注释行bot.stdin.end()
,否则我不会从bot获得任何输出(在几次运行中,我得到了两行,但不是全部)
我尝试了不同的方法,比如直接从bot.stdout
读取,或者显式刷新python程序中的缓冲区,或者使用execFile
而不是spawn。。。但一切都无济于事
因此,我的问题是:如何让节点程序通过stdin
和stdout
与另一个进程交互通信,而不必关闭管道,或等待所述进程的执行完成?
也许有一个完全不同的方法我应该遵循
编辑:在我的Fedora 25工作站上运行上述代码会导致以下输出和程序无限期挂起:
[] % ./poc.js
Dispatching lines...
Connected false
Sending I
Connected false
Sending LOVE
Connected false
Sending DEAD
Connected false
Sending BEEF
Connected false
Sending EOF
BOT SAYS [ 'Bot spawning!' ]
BOT SAYS [ 'ECHO: I' ]
请注意,子进程
bot
一直处于断开状态,但仍有两行输入被处理…我认为问题不在于bot如何写入其输出,而在于它如何处理其输入
asyncio注意到输入流中有数据,并调用回调,但回调没有处理所有可用的输入。回调不会被再次调用,因为流在之后没有更改,剩余的输入很可能保存在缓冲区中等待
我想您会希望回调函数在返回之前处理任何输入,直到无法获取更多 我会在有时间的时候试试(可能今晚在家里)。现在谢谢你的建议!:)