Как мне вызвать код Python из Ruby? - PullRequest
5 голосов
/ 08 мая 2009

Существует ли простой в использовании мост между Ruby и Python? Или мне лучше использовать system ()?

Ответы [ 5 ]

6 голосов
/ 16 марта 2011
6 голосов
/ 08 мая 2009

Вы можете попробовать Библиотека Масаки Фукусимы для встраивания python в ruby, хотя, похоже, он не поддерживается. YMMV

С помощью этой библиотеки сценарии Ruby могут напрямую вызывать произвольные модули Python. Можно использовать как модули расширения, так и модули, написанные на Python.

Забавно названный Нечестивый от гениального Почему Lucky Stiff также может быть полезен:

Компилировать байт-код Ruby to Python.
И, кроме того, переведите это
байт-код обратно в исходный код Python использование декомпиляции (входит в комплект)

Требуется Ruby 1.9 и Python 2.5.

2 голосов
/ 08 мая 2009

Я не думаю, что есть какой-либо способ вызвать Python из Ruby, не разветвляя процесс, через system () или что-то в этом роде. Время выполнения языка совершенно иное, в любом случае они должны быть в отдельных процессах.

0 голосов
/ 31 декабря 2012

Если вы хотите использовать код Python, как будто ваш скрипт Python является функцией, попробуйте IO.popen.

Если вы хотите перевернуть каждую строку в массиве, используя скрипт Python "reverse.py", ваш код ruby ​​будет выглядеть следующим образом.

strings = ["hello", "my", "name", "is", "jimmy"]
#IO.popen: 1st arg is exactly what you would type into the command line to execute your python script.
#(You can do this for non-python scripts as well.)
pythonPortal = IO.popen("python reverse.py", "w+")
pythonPortal.puts strings #anything you puts will be available to your python script from stdin
pythonPortal.close_write

reversed = []
temp = pythonPortal.gets #everything your python script writes to stdout (usually using 'print') will be available using gets
while temp!= nil
    reversed<<temp
    temp = pythonPortal.gets
end 

puts reversed

Тогда ваш скрипт на Python будет выглядеть примерно так

import sys

def reverse(str):
    return str[::-1]

temp = sys.stdin.readlines() #Everything your ruby programs "puts" is available to python through stdin
for item in temp:
    print reverse(item[:-1]) #Everything your python script "prints" to stdout is available to the ruby script through .gets
    #[:-1] to not include the newline at the end, puts "hello" passes "hello\n" to the python script

Выход: olleh У Эман си ymmij

0 голосов
/ 08 мая 2009

Для запуска кода на Python интерпретатор должен быть запущен как процесс. Поэтому system () - ваш лучший вариант.

Для вызова кода Python вы могли бы использовать RPC или сетевые сокеты, полученные для самой простой вещи, которая могла бы сработать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...