2014-02-08 30 views
0

我想从ruby方法运行python脚本。我在Rails应用程序中将此方法作为rake任务运行。我使用的方案中提到here如何获得从红宝石方法执行的python脚本的输出

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脚本我试图词典列表传递给红宝石功能。 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

你可以直接在命令行上运行吗? –

+0

@thorstenmüller:是的,python脚本在命令行 – nish

+0

['Kernel#''](http://ruby-doc.org/core-2.1.0/Kernel.html#method-i-60)不要把它的论点看成是字符串。 –

回答

1

当你这样做:

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

output将被赋予python脚本的标准输出,但剧本没有写任何东西到标准输出; json数据是parse()调用的返回值,它只是被丢弃。您似乎期待脚本的执行有一个“返回值”,即脚本最后一个表达式的返回值,但这不是过程的工作方式。

您可能想要将脚本末尾的parse()呼叫替换为print parse()

+0

其实我犯了一个错误。这给出了一个奇怪的错误。更新了问题。 – nish

1

要调用在壳此确切的行:

"python2 -path- /parse.py" 

其中壳解释为单个命令:(末尾带有空间python2

尝试使用字符串插值,它与反引号操作符:

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

我已经试过这个:output ='python2#{path}/parse.py'。它不打印任何东西。在提问中提到 – nish

+0

@nish你确定你的Python脚本*在标准输出上打印了什么吗? – whatyouhide

+0

编辑。 Sry先前发布了错误的文章。 python脚本工作正常。 – nish

1

想象键入这个确切的字符串:

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

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

+ 
path 
+ 
/parse.y 

你不能把任意Ruby代码反引号字符串中你不能把任意代码在法线串一样。您必须使用字符串插值。

+0

我已经试过字符串插值,它不会给出任何错误。但是不打印任何东西。在问题 – nish

+0

的编辑部分提到过,那么你应该简化它后发布你的所有代码:SSCCE.org。 –

+0

'%x {..}'不会接受字符串,所以''“python2”+ path +“/parse.py”''会抛出错误。 –