0

Python スクリプトによって実行される Ruby スクリプトがあります。Pythonスクリプト内から、ruby関数の戻り値にアクセスしたい。

想像してみてください。このRuby スクリプト test.rbがあるとします。

class TestClass
    def self.test_function(some_var)
        if case1
            puts "This may take some time"
            # something is done here with some_var
            puts "Finished"
        else
            # just do something short with some_var
        end
        return some_var
    end
end

ここで、その関数の戻り値をpython スクリプトに取得したいと思います。印刷された出力は stdout に送られるはずです。

私は次のことを試しました(例1):

from subprocess import call
answer = call(["ruby", "-r", "test.rb", "-e", "puts TestClass.test_function('some meaningful text')"])

ただし、これにより stdout に出力全体が表示され、answer単なる終了コードになります。

したがって、私はこれを試しました(例2):

from subprocess import check_output
answer = check_output(["ruby", "-r", "test.rb", "-e", "puts TestClass.test_function('some meaningful text')"])

これにより、 else の場合(test.rb を参照)の関数の戻り値がすぐに得られます。ただし、case1が true の場合、answer出力全体が含まれますが、test.rb の実行中は何も出力されません。

ruby 関数の戻り値と stdout に出力されたステートメントを取得する方法はありますか? 理想的には、ソリューションに追加のモジュールをインストールする必要はありません。さらに、ルビコードを変更することはできません。

編集:

これも試しましたが、Rubyスクリプトの実行中にstdoutに出力がありません(例3 ):

import subprocess
process = subprocess.Popen(["ruby", "-r", "test.rb", "-e", "puts TestClass.test_function('some meaningful text')"], stdout=subprocess.PIPE)
answer = process.communicate()

また、これは ruby​​ スクリプトで stdout に出力をフラッシュする問題ではないと思います。例 1 では、すぐに出力が得られます。

4

2 に答える 2

1

Ruby スクリプトを外部プロセスとして呼び出そうとせずにこれを行う別の方法は、Ruby スクリプトを使用して xmlrpc (または jsonrpc) サーバーをセットアップし、Python jsonrpc クライアント (または xmlrpc) からリモート関数を呼び出すことです。値はPython プログラム内で利用可能であり、使用される構文でさえ、通常の Python 関数を扱っているのと同じです。

このようなサーバーを設定して、いくつかの関数をリモートで公開することは、Python では非常に簡単で、Ruby でも同じはずですが、試したことはありませんでした。

于 2012-04-26T03:09:48.577 に答える
0

http://docs.python.org/library/subprocess.html#popen-constructorをチェックして、stdout をフラッシュする ruby​​ の方法を調べてください。

于 2012-04-25T20:43:56.590 に答える