在 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")
我可以在 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")