2012-04-25 68 views
0

我有一個ruby腳本,它被python腳本執行。從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腳本,打印輸出應去標準輸出。

我嘗試以下(例如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爲真,answer包含整個輸出,但運行test.rb時不會打印任何內容。

有沒有辦法獲得ruby函數的返回值和打印到stdout的語句?理想情況下,該解決方案不需要安裝額外的模塊。此外,我無法更改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() 

我也認爲這是沒有的事將輸出刷新到ruby腳本中的stdout。例1給我立即輸出。

+2

它與其他程序是否用Ruby編寫無關。您需要使用popen從標準輸出中獲取輸出流。 – texasbruce 2012-04-25 20:47:15

回答

0

檢查出http://docs.python.org/library/subprocess.html#popen-constructor並查看紅寶石意味着沖洗標準輸出。

+0

如果stdout在進程退出時不刷新(不是嗎?),您可以在腳本的頂部使用'$ stdout.sync = true'或在末尾使用'$ stdout.flush'。 – Phrogz 2012-04-25 20:58:36

+0

我嘗試使用'process = subprocess.Popen(...)'和'process.communicate()'。但是這給出了相同的結果 - 在ruby腳本運行時,我沒有任何標準輸出。 – user1251007 2012-04-26 09:44:10

1

這樣做的另一種方法是在不嘗試將ruby腳本作爲外部進程調用的情況下,使用Ruby腳本設置xmlrpc(或jsonrpc)服務器,並從Python jsonrpc客戶端(或xmlrpc)調用遠程函數, - 這個值可以在Python程序中使用,甚至使用的sntax就好像你在處理一個普通的Python函數一樣。

設置這樣一個遠程暴露一些函數的服務器在Python中很容易,而且應該和Ruby相同,但我從來沒有嘗試過。