在Racket中使用Python库

时间:2016-08-27 13:41:23

标签: python racket ffi

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

https://github.com/nurv/pnil还有一个有限的Python to Lisp翻译器。对于Racket有类似的东西吗?

编辑:正如评论中所建议的那样,我尝试了以下内容。这个python代码在文件" pysamples.rkt"在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

3 个答案:

答案 0 :(得分:4)

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库使其位于球拍路径中并获得#lang python顶线。所有已定义的内容始终都会导出。

答案 1 :(得分:4)

PyonR项目是我所知道的最接近使用Racket的Python库的现成方法。但请注意,用Python编写的Python库与Python库之间的Python库之间存在差异。正如你所经历的那样,后者的类型不起作用(至少据我所知 - 但佩德罗是要问的人)。

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

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

答案 2 :(得分:2)

之前的答案和评论解决了某些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")