3

我有一个非常大的 Lisp 项目,我想以编程方式将其输出传递给 Python 程序,即使用 Python 在某些输入上调用 Lisp 程序并将输出返回到 Python。

该项目仅在 Clozure Common Lisp (ccl64) 中编译,我确实尝试找到一种方法将其转换为可执行文件(我使用的是 Mac OS X),但这遇到了很多死胡同(我不是 Lisp程序员)。

Clozure Common Lisp 的文档应该提供上述解决方案,但我无法理解它。我制作的示例创建了一个文件,但终端不会将它们作为可执行文件运行。

如何为 ccl64 创建可执行文件

我试图按照这个问题的答案将 Common Lisp 编译为可执行文件,除了使用 ccl64 的保存应用程序功能。

$ ccl64
Welcome to Clozure Common Lisp Version 1.9-dev-r15612M-trunk  (DarwinX8664)!
? (in-package :ccl)  
#<Package "CCL">
? (defun main () (print "hello"))
MAIN
? (save-application "hello" :toplevel-function #'main)

我正在尝试使用 Python 的子进程来调用 ccl64,运行 Lisp 程序并获取输出。但是,子进程由于某种原因拒绝运行 ccl64 命令。这是我到目前为止写的:

import subprocess

process = subprocess.Popen(['ccl64', '-h'], stdout=subprocess.PIPE)
out, err = process.communicate()

该变量out应包含从 ccl64 获取使用/帮助的输出。相反,我得到一个错误:

Traceback (most recent call last):
  File "sub.py", line 3, in <module>
    process = subprocess.Popen(['ccl64', '-h'], stdout=subprocess.PIPE)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 679, in __init__
    errread, errwrite)
  File "/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/subprocess.py", line 1249, in _execute_child
    raise child_exception
OSError: [Errno 2] No such file or directory

如何让 Python 调用 ccl64 并从 Lisp 项目中获取输出?

4

1 回答 1

4

Python 代码中的错误很明显:没有这样的文件或目录。

您需要在 Python 代码中以实际找到的方式告诉您要运行哪个应用程序。

也不清楚为什么将 Lisp 可执行文件保存在名为 的地方hello,但您并没有尝试调用它。有必要的路径。您的代码尝试调用 Clozure CL - 没有必要的路径 - 但为什么呢?您刚刚保存了一个可执行文件。为什么要调用 Clozure CL 来运行它?我还会在内核之前保存可执行文件- 这使它成为独立的。

例子:

调用 Clozure CL:

rjmba:~ joswig$ ccl
Welcome to Clozure Common Lisp Version 1.9-dev-r15612M-trunk  (DarwinX8664)!

定义main函数:

? (defun main () (print "hello"))
MAIN

保存可执行文件:

? (save-application "hello" :toplevel-function #'main :prepend-kernel t)

从同一目录运行新的可执行文件:

rjmba:~ joswig$ ./hello

"hello" 

使用参数调用 Clozure CL 应用程序:

bash-3.2$ ccl
Welcome to Clozure Common Lisp Version 1.9-dev-r15612M-trunk  (DarwinX8664)!

该函数ccl::command-line-arguments将参数作为列表返回。第一项是被调用的应用程序本身。

? (defun main ()                                                                
    (print (second (ccl::command-line-arguments))))
MAIN

? (save-application "hello"                                                     
                    :toplevel-function #'main                                   
                    :prepend-kernel t)

调用它:

bash-3.2$ ./hello hello!

"hello!"
于 2014-12-01T07:57:43.753 回答