在 Racket 中使用 Python 个库

Using Python libraries in Racket

我可以在 Racket 中使用 Python 代码和库吗?我已经在 DrRacket 中安装了 PyonR (https://github.com/pedropramos/PyonR),所以我可以选择“#lang python”和 运行 Python 代码。但是我如何为我的应用程序组合 Racket 和 Python 语言代码?

https://github.com/nurv/pnil 也有有限的 Python Lisp 翻译器。 Racket 有类似的东西吗?


编辑:按照评论中的建议,我尝试了以下操作。文件 "pysamples.rkt" 中的 python 代码在 DrRacket 中运行良好:

#lang python

def greet(name):
    print 'Hello', name

greet('Alfred')

输出:

Hello Alfred

我尝试在 Racket 代码中使用上面的定义,但它没有用。以下是球拍代码:

#lang racket
; (require python/config) (enable-cpyimport!) ; ran this once; worked.

(#%require "pysamples.rkt")
(greet "Racket_code")

错误是:

greet: unbound identifier in module in: greet

Accoring to the readme你可以导入python 2.7包,但是你需要使用cpyimport。其中一个示例如下所示:

#lang python
cpyimport numpy as np
from "racket" import time

    def add_arrays(n):
        result = np.zeros((100,100))
        for i in range(n):
            result += np.random.randint(0, 100000, (100,100))
        return result

    print time(add_arrays(10000))

查看代码,您可以导入一个纯 python 库,因为它位于 rackets 路径中,并被赋予 #lang python 顶行。所有定义的总是导出。

PyonR 项目是我所知道的使用 Racket Python 库的最接近即用型的方式。但是请注意,用 Python 编写的 Python 库与 Python 库之间存在差异,后者是 C 库顶部的薄 Python 层。正如您所经历的,后一种类型不起作用(至少据我所知 - 但 Pedro 是要问的人)。

如果你需要使用用 X 语言编写的库(X 可以是 Python),你总是可以用 X 语言编写一个 "listener" 程序来等待来自 Racket 程序的消息,当收到一条消息时,计算一个答案并将其发送回 Racket 程序。如何发送和接收消息取决于你,但一个简单的选择是有两个文件,一个 "R-to-X" Racket 写入和 X 从中读取,另一个 "X-to-R" Racket 接收消息。

这种方法有一些开销,但如果计算比发送消息花费的时间更长,那么它是一个可行的解决方案。

之前的答案和评论解决了某些 Python 库的困难,但是如果您只是对在 Racket 模块中使用来自纯 Python 文件的函数感兴趣,请尝试这样的事情:

在文件 "greetings.py" 中:

#lang python

def greet(name):
    print 'Hello', name

在球拍中:

#lang racket

(require python)
(py-import "greetings" as python-module)

(py-method-call python-module "greet" "Racket")