我的Python腳本是這樣的:紅寶石:讓Python腳本的返回值
def main():
ret = [1, 2]
return ret
,我叫Python的腳本紅寶石這樣的:
output = system("python script.py")
print output
但是輸出的值是true 。我想得到[1,2]。我的問題是我如何獲得python腳本的返回值?
我的Python腳本是這樣的:紅寶石:讓Python腳本的返回值
def main():
ret = [1, 2]
return ret
,我叫Python的腳本紅寶石這樣的:
output = system("python script.py")
print output
但是輸出的值是true 。我想得到[1,2]。我的問題是我如何獲得python腳本的返回值?
首先,讓您的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`)
如果您有Python腳本print
其結果,那麼它將在result
中捕獲。這是「標準輸出」,即StdOut,這是ruby的system
讀取的內容。
您還需要讓python腳本在命令行運行時實際調用該方法。
編輯
我的錯誤,使用反引號,而不是system
。而不是使用正則表達式或字符串操作在python和ruby之間傳遞數據,請使用像json或yaml這樣的標準序列化格式。
這是蟒蛇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返回值,也許你可以嘗試它並不斷搜索更好的解決方案。
從我能告訴'system()'返回'true','false'或'nil'基於命令的返回碼 - 而不是輸出。 – kindall
@kindall已更新 –