【问题标题】:Get return value of ruby function in python在python中获取ruby函数的返回值
【发布时间】:2013-10-04 17:05:08
【问题描述】:

我有一个由 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 脚本中,打印输出应该转到标准输出。

我尝试了以下方法(示例 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 case 中函数的返回值(参见 test.rb)。但是,如果 case1 为真,answer 将包含整个输出,但在运行 test.rb 时不会打印任何内容。

有什么方法可以获取 ruby​​ 函数的返回值和打印到标准输出的语句?理想情况下,该解决方案不需要安装额外的模块。此外,我无法更改 ruby​​ 代码。

编辑:

也试过这个,但是在运行 ruby​​ 脚本(示例 3)时,这在 stdout 上也没有输出:

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 立即给了我输出。

【问题讨论】:

  • 与其他程序是否用Ruby编写无关。您需要使用 popen 从标准输出中获取输出流。

标签: python ruby command-line


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 如果在进程退出时没有刷新标准输出(不是吗?),您可以在脚本顶部使用 $stdout.sync=true 或在末尾使用 $stdout.flush
    • 我尝试使用process = subprocess.Popen(...)process.communicate()。但这给出了相同的结果 - 在运行 ruby​​ 脚本时,我对标准输出一无所知。
    猜你喜欢
    • 1970-01-01
    • 2023-01-10
    • 1970-01-01
    • 1970-01-01
    • 2019-01-20
    • 1970-01-01
    • 1970-01-01
    • 2015-11-19
    • 2013-10-24
    相关资源
    最近更新 更多