Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.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
如何从节点1与python3程序交互通信?_Python_Node.js_Pipe_Python 3.5 - Fatal编程技术网

如何从节点1与python3程序交互通信?

如何从节点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

我有以下“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 = 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注意到输入流中有数据,并调用回调,但回调没有处理所有可用的输入。回调不会被再次调用,因为流在之后没有更改,剩余的输入很可能保存在缓冲区中等待


我想您会希望回调函数在返回之前处理任何输入,直到无法获取更多

我会在有时间的时候试试(可能今晚在家里)。现在谢谢你的建议!:)