3

私は非常に大きな Lisp プロジェクトを持っており、その出力をプログラムで Python プログラムにパイプします。つまり、Python を使用して入力に対して Lisp プログラムを呼び出し、出力を Python に戻します。

プロジェクトは Clozure Common Lisp (ccl64) でのみコンパイルされ、実行可能ファイルに変換する方法を見つけようとしましたが (私は Mac OS X を使用しています)、多くの行き止まりに遭遇しました (私は Lisp ではありません)。プログラマー)。

Clozure Common Lisp のこのドキュメントは上記の解決策を提供するはずですが、私はそれを理解できませんでした。私が作成した例ではファイルが作成されましたが、ターミナルはそれらを実行可能ファイルとして実行しませんでした。

ccl64 の実行可能ファイルを作成する方法

この質問の回答Compiling Common Lisp to an executable except using ccl64's save application function に従おうとしました。

$ 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 コードのエラーは明らかです: No such file or directory.

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 に答える