从Ruby调用Python

时间:2010-09-09 18:33:49

标签: python ruby

我有一个编译的Python库和API文档,我想从Ruby中使用它。

是否可以加载Python库,实例化其中定义的类并从Ruby调用该对象的方法?

6 个答案:

答案 0 :(得分:14)

This article提供了一些从Python运行Ruby代码的技术,这些技术也应该适用于反向(例如XML-RPC或管道)以及从Ruby运行Python代码的特定技术。特别是rubypythonRuby/Python看起来他们可能会做你想做的事。

答案 1 :(得分:5)

听起来你会想要使用类似Apache Thrift的东西,它允许你的python或你的ruby代码成为服务器/客户端并相互调用。 http://thrift.apache.org/

您可以根据您的thrift定义在ruby和/或python中实例化对象。这是节俭网站的一个例子。

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

基本上你的ruby或python可以调用store()retrieve()并创建UserProfile个对象等。

答案 2 :(得分:4)

这个小型库使得执行此操作非常容易:https://github.com/steeve/rupy

答案 3 :(得分:2)

即使您可以完成这项工作,您也可以考虑这是否是最佳建筑选择。你可能会遇到各种版本的地狱,试图维持这样的野兽。

如果你真的找不到一个等效的Ruby库(或者你想利用它在Python上的大量投资),可以考虑使用队列(如RabbitMQ)来实现消息传递设计。然后你可以保持你的Python位Python和Ruby位Ruby,而不是试图维护一个Frankenstein构建环境。

答案 4 :(得分:0)

你在Windows上吗?您可以创建一个DLL or COM object from your python lib并使用Ruby的Win32ApiWin32Ole来调用它吗?

答案 5 :(得分:0)

https://github.com/mrkn/pycall.rb

下面是一个简单的示例,它调用Python的math.sin函数并将其与Ruby中的Math.sin进行比较:

require 'pycall/import'
include PyCall::Import
pyimport :math
math.sin(math.pi / 4) - Math.sin(Math::PI / 4)   # => 0.0

从Ruby到Python的类型转换会自动针对数字,布尔值,字符串,数组和哈希进行。