我正在尝试从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()
有人可以解释我做错了什么,我该如何解决这个问题。感谢
答案 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()
来电。