【问题标题】:Ruby: get return value of python scriptRuby:获取python脚本的返回值
【发布时间】:2017-02-23 01:53:12
【问题描述】:

我的python脚本是这样的:

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

我像这样从 ruby​​ 调用 python 脚本:

output = system("python script.py")

print output

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

【问题讨论】:

    标签: python ruby return return-value


    【解决方案1】:

    首先,让您的 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`)
    

    【讨论】:

      【解决方案2】:

      这是python test.py

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

      这是 ruby​​ 代码 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 返回至少现在很有价值,也许您可​​以尝试并不断寻找更好的解决方案。

      【讨论】:

      • print在 Python 中默认进入标准输出。
      • @kindall,你说得对,print >> sys.stdout, ret可以改成print ret
      【解决方案3】:

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

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

      编辑

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

      【讨论】:

      • 据我所知,system() 根据命令的返回码而不是输出返回 truefalsenil
      猜你喜欢
      • 2015-10-06
      • 1970-01-01
      • 1970-01-01
      • 2014-03-01
      • 2015-09-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-03-14
      相关资源
      最近更新 更多