有没有简单的方法在Common Lisp中使用Python库?

13 投票
5 回答
3250 浏览
提问于 2025-04-16 12:51

在写Common Lisp代码的时候,我最想念的一件事就是能用到Python的库,包括标准库和第三方模块。CLPython提供的Python功能很有限,很多库都不能用,所以对我来说没什么用。我希望能从Common Lisp调用Python代码,让它在像CPython或PyPy这样的Python虚拟机里运行。

5 个回答

3

你可以试试burgled-batteries,这是一个连接Python和Lisp的工具(有一些外部接口的绑定等等)。

根据描述,"burgled-batteries在Python(特别是Python的CPython实现)和Common Lisp之间提供了一个桥梁。"

5

(编辑) 现在我们有了 py4cl: https://github.com/bendudson/py4cl

Py4CL 是一个连接 Common Lisp 和 Python 的工具,它可以让 Common Lisp 和 Python 代码进行互动。它通过流来和一个独立的 Python 进程进行通信,这种方法是由 cl4py 提出的。这和 burgled-batteries 使用的 CFFI 方法不同,但目标是一样的。

下面是一个在 Lisp 程序中使用 Numpy 和 Scipy 的例子:

(ql:quickload :py4cl)

(py4cl:import-module "numpy" :as "np")
(py4cl:import-module "scipy.integrate" :as "integrate")

;; Integrate some ODEs
(defparameter *data*
  (integrate:odeint 
   (lambda (y time) 
     (vector (aref y 1)       ; dy[0]/dt = y[1]
             (- (aref y 0)))) ; dy[1]/dt = -y[0]
   #(1.0 0.0)   ; Initial state
   (np:linspace 0.0 (* 2 pi) 20)))  ; Vector of times

你可能还会喜欢 async-process,它可以向一个正在运行的 Python 进程发送代码。这个工具在 Lem 编辑器 中使用。

使用示例:

CL-USER> (ql:quickload :async-process)
To load "async-process":
  Load 1 ASDF system:
    async-process
; Loading "async-process"
..................................................
[package async-process].
(:ASYNC-PROCESS)
CL-USER> (in-package async-process)
#<PACKAGE "ASYNC-PROCESS">
ASYNC-PROCESS> (create-process "python")
#.(SB-SYS:INT-SAP #X7FFFEC002830)
ASYNC-PROCESS> (defparameter p *)
#.(SB-SYS:INT-SAP #X7FFFEC002830)
ASYNC-PROCESS> (process-receive-output p)
"Python 2.7.13 (default, Nov 24 2017, 17:33:09) 
[GCC 6.3.0 20170516] on linux2
Type \"help\", \"copyright\", \"credits\" or \"license\" for more information.
>>> "
ASYNC-PROCESS> (process-send-input p "1+1
")
; No value
ASYNC-PROCESS> (process-receive-output p)
"1+1
2
>>> "
4

一个解决方案是 python-on-lisp。这个东西应该可以通过ASDF来安装。不过它已经有好几年没有维护和更新了,所以可能会有更好的选择。

撰写回答