用Ruby调用Python

30
我有一个已编译的Python库和API文档,希望能在Ruby中使用。
是否可以加载Python库,在Ruby中实例化其中定义的类,并调用该对象的方法?
6个回答

14

本文提供了一些在Python中运行Ruby代码的技巧,这些技巧也适用于反向操作(如XML-RPC或管道),以及运行Ruby中Python代码的特定技巧。特别是rubypythonRuby/Python看起来可能会满足你的需求。


你知道这两个产品之间有没有可用的比较吗? - Bryan Ash
很遗憾,我没有使用过任何一个。 - kindall
3
我向 Ruby/Python 作者询问了这个项目,他说它已经很旧且不再维护,所以你最好选择 Ruby Python。 - ThomasW
RubyPython自2012年以来就没有更新过,明确不支持Python3,我敢打赌它需要更新以适应Ruby 2.x -- 看起来似乎没有进程内的解决方案,某种形式的IPC是唯一的选择。 - lamont
是的,现在我可能建议子进程之间使用JSON通信。 - kindall

5

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 的类型转换会自动处理数字、布尔值、字符串、数组和哈希表。

5
看起来您需要使用类似于Apache Thrift的东西,它允许您的Python或Ruby代码作为服务器/客户端并相互调用。 http://thrift.apache.org/ 根据您的Thrift定义,您可以在Ruby和/或Python中实例化对象。这是Thrift网站上的一个示例。
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()函数以及创建对象等。


1
哇,这真是太棒了,而且非常巧妙!它基本上是将您的代码打包并像API一样提供服务。谢谢分享! - John

4

3

即使您能让这个工作起来,您可能需要考虑这是否是最佳的架构选择。您可能会遇到各种版本控制问题,试图维护这样一个庞然大物。

如果您真的找不到等效的Ruby库(或者您想利用Python进行大量投资),请考虑使用队列(例如RabbitMQ)来实现消息传递设计。然后,您可以将Python部分保持为Python,将Ruby部分保持为Ruby,而不尝试维护弗兰肯斯坦式的构建环境。


Python库是商业测试设备的接口,因此我没有更改它或在Ruby中重写的选项。 - Bryan Ash

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接