Ruby:获取python脚本的返回值

时间:2017-02-23 01:53:13

标签: python ruby return return-value

我的python脚本是这样的:

def main():
  ret = [1, 2]
  return ret

我从ruby这样调用python脚本:

output = system("python script.py")

print output

但是输出值是真的。我想得到[1,2]。我的问题是我如何获得python脚本的返回值?

3 个答案:

答案 0 :(得分:3)

首先,让您的Python脚本打印值而不是返回它,或者在底部添加print main(),以便打印main()的返回值。

其次,在Ruby方面,使用反引号而不是system()函数执行它,如下所示:

output = `python script.py`

这会将Python脚本的输出捕获为字符串。如果你想将它作为Ruby数组,你需要解析它。 Ruby的数组文字语法类似于Python的列表文字语法,所以这并不像看起来那么难。如果你能找到将字符串解析为Ruby数组的东西(除了eval(),因为它很危险)你应该被覆盖。当你有除简单类型None之外的东西,或者带有转义的潜在字符串时,会出现问题。

我更像是一个Python人而不是Ruby人,但Ruby似乎没有像标准库中的Python ast.literal_eval(只接受文字的安全eval()那样的东西。但是,我确实发现parsr似乎就是这样。

如果您获得的Python列表文字不是有效的Ruby,则可以使用JSON作为交换格式:

# Python side
import json, sys
json.dump(main(), sys.stdout)

# Ruby side
require 'json'
output = JSON.parse(`python script.py`)

答案 1 :(得分:3)

这是python test.py

import sys

def main():
  ret = [1, 2]
  print >> sys.stdout, ret 

main()

这是ruby code test.rb

require 'open3'
require 'json'

stdin, stdout, stderr = Open3.popen3("python test.py")
stdout.each do |ele|
  p ele #=> "[1, 2]\n"
  p JSON.parse(ele) #=> [1, 2]
end

然后在shell中执行ruby脚本

ruby test.rb 

你需要stdout来获取ruby脚本中的python返回值,并且通过一些丑陋的提示,我在这段时间内找不到另一种更好的方法,但代码可以工作,至少现在接受python返回值,也许你可以尝试并继续搜索更好的解决方案。

答案 2 :(得分:1)

如果您的Python脚本print是其结果,那么它将在result中捕获。这是"标准"即StdOut,它是ruby的system读取的内容。

您还需要让python脚本在从命令行运行时实际调用该方法。

修改

我的错误,使用反引号代替system。而不是使用正则表达式或字符串操作在python和ruby之间传递数据,使用标准的序列化格式,如json或yaml。