まず、Pythonスクリプトで値を返すのではなく出力してください。print main()
を最後に追加すると、戻り値main()
が表示されるようになります。
第二には、Rubyの側で、このように、バッククォートではなくsystem()
機能とそれを実行します。
output = `python script.py`
は、これは文字列としてPythonスクリプトの出力をキャプチャします。あなたがRuby配列としてそれを必要とするならば、それを解析する必要があります。 Rubyの配列リテラル構文はPythonのリストリテラル構文と似ていますので、これは見た目ほど難しいものではありません。文字列をRuby配列にパースするものが見つかった場合(危険なのでeval()
のほかに)、あなたはカバーされるべきです。シンプルな型の他に、None
、あるいはエスケープされた文字列があると問題が発生します。
私はRubyの人よりもPythonの人ですが、標準ライブラリにPythonのast.literal_eval
(安全なeval()
はリテラルしか受け付けません)のようなものはありません。しかし、私は正確にそのように見えるparsrを見つけました。
あなたが取得しているPythonのリストリテラルではなく、有効なルビーをしている場合は、交換フォーマットとしてJSONを使用することができます。
# Python side
import json, sys
json.dump(main(), sys.stdout)
# Ruby side
require 'json'
output = JSON.parse(`python script.py`)
私が 'system()'が出力したのではなく、コマンドの戻りコードに基づいて 'true'、' false'、 'nil'を返すことができます。 – kindall
@kindallは –