2014-12-01 6 views
1

У меня есть очень большой проект Lisp, выход которого я хотел бы программно подключить к программе Python, то есть использовать Python для вызова программы Lisp на некотором входе и получить выход обратно в Python.Как получить выход программы Lisp в Python?

Проект компилируется только в Clozure Common Lisp (ccl64), и я попытался найти способ превратить его в исполняемый файл (я использую Mac OS X), но это столкнулось с множеством тупиков (I я не программист Lisp).

Настоящая документация для Clozure Common Lisp должна обеспечить решение вышеизложенного, но я не смог ее понять. Приведенные мной примеры создали файл, но Terminal не выполнил их как исполняемые файлы.

How to create executable for ccl64

Я пытался следовать ответ на этот вопрос в Compiling Common Lisp to an executable за исключением использования 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, запустить Лисп-программу, и получить выход. Однако подпроцесс почему-то отказывается запускать команду 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 и получить выход из Лиспа проекта?

+2

Укажите полный путь к ccl64 двоичной системе. – uselpa

+0

Чтобы немного расширить то, что @LePetitPrince говорит: Когда вы печатаете на терминале, ввод только 'ccl64' работает, потому что исполняемый файл находится в переменной' PATH', но (по умолчанию), 'subprocess' не знает, что 'PATH'. Найдите, где работает исполняемый файл 'ccl64', и передайте весь путь к вашему вызову« Popen ». – BorrajaX

ответ

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!" 
+0

Я сделал исполняемый файл с Clozure CL, но когда я иду на терминал и вводю 'hello' (имя созданного файла), терминал не запускает его. – user3898238

+0

Это работает. Однако, когда я запускаю свой исполняемый файл, он выходит из строя, а затем запускает ccl64 repl, замороженный в нем. Основная функция - просто '(defun main (string) (my-fun string))'. – user3898238

+0

Эта функция работает: '(defun main() \t (print" hi ") \t (quit))'. Я превратил его в исполняемый файл под названием «привет». Но предположим, что я хочу напечатать произвольную строку. Как я могу это сделать, когда я набираю './hi hello!', Консоль печатает 'hello!'. – user3898238

Смежные вопросы