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

时间:2012-04-25 20:33:37

标签: python ruby command-line

我有一个由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 case (参见test.rb)中函数的返回值。但是,如果 case1 为true,answer包含整个输出,但在运行test.rb时,不会打印任何内容。

有没有办法获得ruby函数的返回值和打印到stdout的语句?理想情况下,该解决方案不需要安装其他模块。此外,我无法更改ruby代码。

编辑:

还尝试了这个,但是在运行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立即给出了输出。

2 个答案:

答案 0 :(得分:1)

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

设置这样的服务器以远程公开几个函数在Python中非常容易,并且应该与Ruby相同,但我从未尝试过。

答案 1 :(得分:0)

查看http://docs.python.org/library/subprocess.html#popen-constructor并查看红宝石冲洗stdout的方法。