我有一个非常大的Lisp项目,其输出我想编程管道到Python程序,即使用Python在某些输入上调用Lisp程序并将输出返回到Python。
该项目仅在Clozure Common Lisp(ccl64)中编译,我确实试图找到一种方法将其转换为可执行文件(我使用的是Mac OS X),但是它遇到了很多死胡同(我不是Lisp程序员)。
Clozure Common Lisp的这个文档应该提供上面的解决方案,但我无法理解它。我创建的示例创建了一个文件,但终端不会将它们作为可执行文件运行。
How to create executable for ccl64
除了使用ccl64的保存应用程序功能外,我尝试按照此问题回答Compiling Common Lisp to an executable。
$ 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项目获取输出?
答案 0 :(得分:4)
Python代码中的错误很明确:没有这样的文件或目录。
您需要在Python代码中告诉您要以实际找到它的方式运行哪个应用程序。
还不清楚为什么在名为hello
的某个地方保存一个Lisp可执行文件,但你并没有试图调用它。有了必要的道路。你的代码试图调用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!"