【发布时间】:2013-10-04 17:05:08
【问题描述】:
我有一个由 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')"])
这几乎立即为我提供了 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