Как получить вывод программы Lisp в Python?

У меня есть очень большой проект 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?


person user3898238    schedule 01.12.2014    source источник
comment
Укажите полный путь к бинарнику ccl64.   -  person uselpa    schedule 01.12.2014
comment
Чтобы немного расширить то, что говорит @LePetitPrince: когда вы печатаете на терминале, ввод только ccl64 работает, потому что исполняемый файл находится в вашей переменной окружения PATH, но (по умолчанию) subprocess не знает, что PATH. Найдите, где находится исполняемый файл ccl64, и передайте весь путь к вашему вызову Popen.   -  person BorrajaX    schedule 01.12.2014


Ответы (1)


Ошибка в вашем коде Python ясна: нет такого файла или каталога.

Вам нужно указать в своем коде Python, какое приложение вы хотите запустить, таким образом, чтобы оно действительно его нашло.

Также непонятно, почему вы сохраняете исполняемый файл Лиспа где-то с именем 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!"
person Rainer Joswig    schedule 01.12.2014
comment
Я сделал исполняемый файл с помощью Clozure CL, но когда я захожу в терминал и ввожу hello (имя созданного файла), терминал его не запускает. - person user3898238; 01.12.2014
comment
Это работает. Однако, когда я запускаю свой исполняемый файл, он падает, а затем запускает repl ccl64, замороженный в нем. Основная функция просто (defun main (string) (my-fun string)). - person user3898238; 01.12.2014
comment
Эта функция работает: (defun main () (print "hi") (quit)). Я превратил его в исполняемый файл под названием hi. Но предположим, я хочу напечатать произвольную строку. Как мне сделать так, чтобы когда я набираю ./hi hello!, консоль печатала hello!. - person user3898238; 01.12.2014
comment
Я думаю, что мне нужно использовать это глобальное значение: *command-line-argument-list*. - person user3898238; 01.12.2014