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