我的python脚本是这样的:
def main():
ret = [1, 2]
return ret
我从ruby这样调用python脚本:
output = system("python script.py")
print output
但是输出值是真的。我想得到[1,2]。我的问题是我如何获得python脚本的返回值?
答案 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。