在python中获取ruby函数的返回值

问题描述:

我有一个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

检查出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

这样做的另一种方法是在不尝试将ruby脚本作为外部进程调用的情况下,使用Ruby脚本设置xmlrpc(或jsonrpc)服务器,并从Python jsonrpc客户端(或xmlrpc)调用远程函数, - 这个值可以在Python程序中使用,甚至使用的sntax就好像你在处理一个普通的Python函数一样。

设置这样一个远程暴露一些函数的服务器在Python中很容易,而且应该和Ruby相同,但我从来没有尝试过。