我有一个编译的Python库和API文档,我想从Ruby中使用它。
是否可以加载Python库,实例化其中定义的类并从Ruby调用该对象的方法?
答案 0 :(得分:14)
This article提供了一些从Python运行Ruby代码的技术,这些技术也应该适用于反向(例如XML-RPC或管道)以及从Ruby运行Python代码的特定技术。特别是rubypython或Ruby/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的Win32Api或Win32Ole来调用它吗?
答案 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的类型转换会自动针对数字,布尔值,字符串,数组和哈希进行。