我有一个由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立即给出了输出。
答案 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的方法。