0

我有一个由 py​​thon 脚本执行的 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')"])

但是,这给了我标准输出的全部输出,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为真,则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​​ 脚本中的标准输出无关。示例 1 立即给了我输出。

4

2 回答 2

1

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

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

于 2012-04-26T03:09:48.577 回答
0

查看http://docs.python.org/library/subprocess.html#popen-constructor并查看 ruby​​ 刷新标准输出的方法。

于 2012-04-25T20:43:56.590 回答