2010-09-09 2 views
23

У меня есть скомпилированная библиотека Python и документы API, которые я хотел бы использовать из Ruby.Вызов Python из Ruby

Возможно ли загрузить библиотеку Python, создать экземпляр класса, определенного в нем, и вызвать методы для этого объекта из Ruby?

ответ

11

предлагает некоторые методы для запуска кода Ruby из Python, который также должен применяться в обратном направлении (например, XML-RPC или каналы), а также конкретные методы для запуска кода Python из Ruby. В частности, rubypython или Ruby/Python выглядят так, как будто они могут делать то, что вы хотите.

+0

Вы знаете о любых доступных сравнениях между этим 2 предложением? –

+0

К сожалению, нет. Я тоже не использовал себя. – kindall

+3

Я попросил автора Ruby/Python о проекте, и он сказал, что он старый и неподдерживаемый, поэтому вам может быть лучше пойти с ruby ​​python. – ThomasW

3

Даже вы можете сделать эту работу, возможно, вам захочется рассмотреть, является ли это лучшим архитектурным выбором. Вы можете столкнуться со всякими версиями адских атак, пытаясь сохранить такого зверя.

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

+0

Библиотека Python - это интерфейс для части коммерческого тестового оборудования, поэтому у меня нет возможности изменить его или переписать в Ruby. –

4

Это звучит, как вы хотели бы использовать что-то вроде Apache бережливости, которая позволяет либо ваш питон или код рубин быть клиент/сервер и созвонимся Другие. http://thrift.apache.org/

Вы можете создавать объекты в рубине или в python на основе определения бережливости. Это пример с сайта бережливости.

struct UserProfile { 
    1: i32 uid, 
    2: string name, 
    3: string blurb 
    } 
    service UserStorage { 
    void store(1: UserProfile user), 
    UserProfile retrieve(1: i32 uid) 
    } 

В основном ваш рубин или питон будет в состоянии назвать store() и retrieve() и создавать UserProfile объектов и т.д.

+1

Ничего себе. Это довольно потрясающе, и изобретательно! Это, в основном, сворачивание кода и обслуживание их как API. Спасибо, что поделился! – John