2012-04-25 14 views
0

pythonスクリプトで実行されるrubyスクリプトがあります。 Pythonスクリプトの中から、私はRuby関数の戻り値にアクセスする必要があります。私は私のPythonスクリプト、印刷出力がすべきにその関数の戻り値を取得したい、今すぐpythonでruby関数の戻り値を取得

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 

は、私はこのRubyスクリプトtest.rbを持つことになり、想像しますstdoutに行く。

私は、次の(例1)を試してみました:

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

はしかし、これは私に標準出力に出力全体を与え、answerはちょうど終了コードです。

ので、私は(例2)、これを試してみました:

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

これは、ほとんどすぐに(test.rbを参照してください)私他の場合における関数の戻り値を与えます。ただし、case1がtrueの場合、answerには出力全体が含まれますが、test.rbを実行している間は何も印刷されません。

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

編集:

。また、これを試みたが、Rubyスクリプト(例3)を実行しながら、これはまた、標準出力に何も出力を与えない:

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

私も、これは無問題だと思いますルビスクリプトで出力を標準出力にフラッシュします。例1は私にすぐに出力を与えます。

+2

他のプログラムがRubyで書かれているかどうかは関係ありません。標準出力から出力ストリームを取得するには、popenを使用する必要があります。 – texasbruce

答えて

0

http://docs.python.org/library/subprocess.html#popen-constructorをチェックして、ルービーの標準出力を調べます。

+0

プロセスが終了したときにstdoutがフラッシュされない場合は、スクリプトの先頭に '$ stdout.sync = true'を、最後に' $ stdout.flush'を使用することができます。 – Phrogz

+0

'process = subprocess.Popen(...)'と 'process.communicate()'を使ってみました。しかし、これは同じ結果をもたらします - 私はルビースクリプトが実行されている間は何もしません。 – user1251007

1

ruby​​スクリプトを外部プロセスとして呼び出さずに、Rubyスクリプトでxmlrpc(またはjsonrpc)サーバを設定し、Pythonのjsonrpcクライアント(またはxmlrpc)からリモート関数を呼び出すこともできます。 - 値はPythonプログラムの中で利用できるでしょう。もしあなたが普通のPython関数を扱っていたのと同じように使用されていたとしても。

いくつかの機能をリモートから公開するように設定するのは、Pythonではとても簡単で、Rubyでも同じですが、試したことはありませんでした。

関連する問題