2014-02-08 75 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」''會拋出錯誤。 –