如何将Lisp程序输出到Python中?

时间:2014-12-01 04:38:13

标签: python lisp common-lisp executable ccl

我有一个非常大的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项目获取输出?

1 个答案:

答案 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!"