Сначала попросите свой скрипт Python напечатать значение, а не вернуть его, или добавить print main()
внизу, так что будет напечатано возвращаемое значение main()
.
Во-вторых, на стороне Руби, выполнить его обратные кавычки, а не функции system()
, как это:
output = `python script.py`
Это перехватывает вывод сценария Python в виде строки. Если вы хотите, чтобы он был массивом Ruby, вам нужно его проанализировать. Строковый синтаксис массива Ruby похож на синтаксис литерального списка списка Python, поэтому это не так сложно, как может показаться. Если вы можете найти что-то, что разбирает строки в массивах Ruby (кроме eval()
, потому что это опасно), вы должны быть закрыты. Проблемы возникают, если у вас есть вещи помимо простых типов, None
или потенциально строки с экранами в них.
Я скорее парень на Python, чем парень Ruby, но Ruby, похоже, не имеет ничего похожего на Python's 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 updated –