0

最初に注意すべき点: 私は 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またはなどのように)

4

2 に答える 2