私は、以下の「ボット」Pythonスクリプトがあります。ノード1からPython3プログラムと対話的に通信する方法は?
#! /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()
のコメントを解除しない限り、私は得ることはありませんということですボットからの出力(いくつかの実行では2行戻ってきましたが、すべてではありません)。
私はbot.stdout
から直接読んだり、明示的にPythonプログラムでバッファをフラッシュしたり、またはspawn ...ではなくexecFile
を使って別のアプローチを試みましたが、役に立たないものです。
だから私の質問は次のとおりです。私はノードプログラムが対話的にパイプを閉じる、または終了すると、プロセスの実行を待つことなく、別のプロセスでstdin
とstdout
を介して通信することができますか?
おそらく、私が従うべき全く異なるアプローチがありますか?
EDIT:私のFedora 25駅に上記のコードを実行すると、以下の出力とindefinitivelyハングアップするプログラムを引き起こす:子プロセスbot
がまだすべての時間を切断し、されていることを
[] % ./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' ]
注意それにもかかわらず、入力の2行が処理されます...
私は1分(おそらく今夜は家にいる)があるときにそれを試みます。今はおかげでありがとう! :) – mac