2017-02-23 12 views
1

我的Python腳本是這樣的:紅寶石:讓Python腳本的返回值

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

,我叫Python的腳本紅寶石這樣的:

output = system("python script.py") 

print output 

但是輸出的值是true 。我想得到[1,2]。我的問題是我如何獲得python腳本的返回值?

回答

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`) 
1

如果您有Python腳本print其結果,那麼它將在result中捕獲。這是「標準輸出」,即StdOut,這是ruby的system讀取的內容。

您還需要讓python腳本在命令行運行時實際調用該方法。

編輯

我的錯誤,使用反引號,而不是system。而不是使用正則表達式或字符串操作在python和ruby之間傳遞數據,請使用像json或yaml這樣的標準序列化格式。

+0

從我能告訴'system()'返回'true','false'或'nil'基於命令的返回碼 - 而不是輸出。 – kindall

+0

@kindall已更新 –

2

這是蟒蛇test.py

import sys 

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

main() 

這是紅寶石代碼測試。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 

然後在命令行下執行Ruby腳本

ruby test.rb 

需要由stdout獲得在Ruby腳本蟒蛇返回值,並通過一些醜陋的技巧,我沒有找到其他這段代碼是更好的方法,但是代碼至少可以工作並且至少可以接受python返回值,也許你可以嘗試它並不斷搜索更好的解決方案。

+0

'print'在Python中默認爲標準輸出。 – kindall

+0

@kindall,你說得對,'print >> sys.stdout,ret'可以改成'print ret' – Tsao