最初に注意すべき点: 私は Python プログラマーであり、Ruby についての知識はありません!
ここで、Ruby プログラムの stdin をフィードし、python プログラムでスクリプトの stdout をキャプチャする必要があります。
私はこれを試しました(4番目の解決策)、コードはpython2.7では機能しますが、python3では機能しません。python3 コードは、出力なしで入力を読み取ります。
ここで、Ruby プログラムを python 2 または 3 に結び付ける方法が必要です。
私の試み:
このコードは、バージョン間の互換性を保つために 6 つのモジュールで記述されています。
パイソンコード:
from subprocess import Popen, PIPE as pipe, STDOUT as out import six print('launching slave') slave = Popen(['ruby', 'slave.rb'], stdin=pipe, stdout=pipe, stderr=out) while True: if six.PY3: from sys import stderr line = input('enter command: ') + '\n' line = line.encode('ascii') else: line = raw_input('entercommand: ') + '\n' slave.stdin.write(line) res = [] while True: if slave.poll() is not None: print('slave rerminated') exit() line = slave.stdout.readline().decode().rstrip() print('line:', line) if line == '[exit]': break res.append(line) print('results:') print('\n'.join(res))
ルビーコード:
while cmd = STDIN.gets cmd.chop! if cmd == "exit" break else print eval(cmd), "\n" print "[exit]\n" STDOUT.flush end end
ノート:
このようなことを行う別の方法は大歓迎です! (ソケットプログラミングなど)
また、パイプを標準出力として使用せず、ファイルのようなオブジェクトを使用する方が良いと思います。(tempfile
またはStringIO
またはなどのように)