如何获取从ruby方法执行的python脚本的输出

时间:2014-02-08 18:31:15

标签: ruby-on-rails ruby

我正在尝试从ruby方法运行python脚本。我在Rails应用程序中运行此方法作为rake任务。我正在使用提到here的解决方案:

def create
    path = File.expand_path('../../../../GetOrders', __FILE__)
    output = `"python2 " + path + "/parse.py"`
    print output
    str = JSON.parse(output)
    print str
end

编辑:这有效:

    output = `python2 #{path}/parse.py`

EDIT2 : 使用python脚本我试图将字典列表传递给ruby函数。 python脚本看起来像:

import xml.etree.ElementTree as ET
import json

def parse():
    tree = ET.parse('response.xml')
    root = tree.getroot()
    namespaces = {'resp': 'urn:ebay:apis:eBLBaseComponents'}
    order_array = root.find("resp:OrderArray", namespaces=namespaces)
    detailsList = []
    for condition:
        details["key1"] = value1
        details["key2"] = value2
    detailsList.append(details)
    output = json.dumps(detailsList)
    return output

print parse()

有人可以解释我做错了什么,我该如何解决这个问题。感谢

3 个答案:

答案 0 :(得分:1)

你在shell上调用这条确切的行:

"python2 -path- /parse.py"

shell将其解释为单个命令:python2(末尾有空格)。

尝试使用字符串插值,它与反引号运算符一起使用:

output = `python2 #{path}/parse.py`

答案 1 :(得分:1)

想象一下输入这个确切的字符串:

"python2 " + path + "/parse.py"

进入你的shell(例如bash)。它会寻找一个名为“python2”的程序并给它四个参数

+
path
+
/parse.y

你不能将任意Ruby代码放在反引号字符串中,就像你不能在normals字符串中放入任意代码一样。你必须使用字符串插值。

答案 2 :(得分:1)

执行此操作时:

output = `python2 #{path}/parse.py`
将为

output分配python脚本的标准输出,但该脚本不会向标准输出写入任何内容;简单地丢弃了parse()调用的返回值的json数据。您似乎期望脚本的执行具有“返回值”,该值是脚本的最后一个表达式的返回值,但这不是进程的工作方式。

您可能希望使用parse()替换脚本末尾的print parse()来电。