2017-01-23 6 views
0

私は、以下の「ボット」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を使って別のアプローチを試みましたが、役に立たないものです。

だから私の質問は次のとおりです。私はノードプログラムが対話的にパイプを閉じる、または終了すると、プロセスの実行を待つことなく、別のプロセスでstdinstdoutを介して通信することができますか?

おそらく、私が従うべき全く異なるアプローチがありますか?

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行が処理されます...

答えて

0

あなたのボットが出力を書き込む方法ではなく、入力をどのように処理するかに問題はないと思います。

asyncio通知入力ストリームにデータがあり、コールバックをコールしますが、コールバックは使用可能なすべての入力を処理しません。ストリームは変更されず、残りの入力はおそらくバッファに保持され、待機しているため、コールバックは再び呼び出されません。

私はあなたが戻ってくる前に、それ以上フェッチすることができなくなるまで、あなたは任意の入力を処理することを望むと思います。

+0

私は1分(おそらく今夜は家にいる)があるときにそれを試みます。今はおかげでありがとう! :) – mac

関連する問題