在python中获取ruby函数的返回值
我有一个ruby脚本,它被python脚本执行。从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')"])
这使我的功能在其他情况(见test.rb)几乎立即返回值。但是,如果case1为真,answer
包含整个输出,但运行test.rb时不会打印任何内容。
有没有办法获得ruby函数的返回值和打印到stdout的语句?理想情况下,该解决方案不需要安装额外的模块。此外,我无法更改Ruby代码。
编辑:
也试过这个,但是这也给没有输出stdout上运行Ruby脚本而(例如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给我立即输出。
检查出http://docs.python.org/library/subprocess.html#popen-constructor并查看红宝石意味着冲洗标准输出。
如果stdout在进程退出时不刷新(不是吗?),您可以在脚本的顶部使用'$ stdout.sync = true'或在末尾使用'$ stdout.flush'。 – Phrogz 2012-04-25 20:58:36
我尝试使用'process = subprocess.Popen(...)'和'process.communicate()'。但是这给出了相同的结果 - 在ruby脚本运行时,我没有任何标准输出。 – user1251007 2012-04-26 09:44:10
这样做的另一种方法是在不尝试将ruby脚本作为外部进程调用的情况下,使用Ruby脚本设置xmlrpc(或jsonrpc)服务器,并从Python jsonrpc客户端(或xmlrpc)调用远程函数, - 这个值可以在Python程序中使用,甚至使用的sntax就好像你在处理一个普通的Python函数一样。
设置这样一个远程暴露一些函数的服务器在Python中很容易,而且应该和Ruby相同,但我从来没有尝试过。
它与其他程序是否用Ruby编写无关。您需要使用popen从标准输出中获取输出流。 – texasbruce 2012-04-25 20:47:15