2016-09-01 3 views
4

Итак, я прошел мимо фактического получения программы для запуска из SBCL Lisp, используя нижнюю оболочку (предположительно, UIOP будет просто отлично). Во всяком случае, теперь, когда я могу это сделать, я до сих пор не знаю, как взаимодействовать с программой, если она работает в фоновом режиме.Inferior Shell или UIOP: Взаимодействие с фоновым процессом

Все эти функции, такие как трубы и потоки, связанные с stdin и stdout запущенной программы, рекламируются, просто не документируются. Казалось бы, это самое главное.

Есть ли у кого-нибудь пример такого?

Любая помощь приветствуется.

-Todd

+1

Это, вероятно, слишком широкий вопрос для SO. У вас есть простой пример для показа? В чем что-то не ведет себя так, как вы ожидали? – Renzo

+0

@ Renzo, как я понимаю: SBCL имеет 'sb-ext: run-program', который позволяет вам запускать процесс асинхронно и подключать к нему входные и выходные потоки. Затем вы можете общаться с ним, используя потоки в течение всего срока действия программы (например, запустите 'gnuplot' и продолжайте ее работу и построите с использованием того же процесса, а не перезапускайте его все время). В переносном режиме я видел только синхронный: запустите процесс и передайте начальные аргументы - дождитесь окончания. – mobiuseng

+0

Библиотека ['EAZY-PROCESS'] (https://github.com/guicho271828/eazy-process) упрощает создание каналов и асинхронных процессов, но намеренно не обеспечивает поддержку потоков. Все основано на файлах и дескрипторах файлов. Тем не менее, вы можете использовать временные файлы. – coredump

ответ

1

Вы смотрели в руководстве SBCL? Варианты для RUN-PROGRAM документированы там: http://www.sbcl.org/manual/#Running-external-programs

Я думаю, вам просто нужно создать потоки и передать их в RUN-PROGRAM через :input, :output и :error аргументов.

Вот пример, когда я даю RUN-PROGRAM аргументы потока для выполнения gnuplot (хотя я не оставляю входной поток открытым, как вы хотите). https://github.com/belambert/cl-gnuplot/blob/master/src/gnuplot.lisp#L18

+1

Да. Очевидно, что нужно использовать sb-ext: run-program, однако мне нужно запустить командную строку:/usr/bin/java -cp "*" -Xmx2g edu.stanford.nlp.pipeline.StanfordCoreNLP - аннотаторы tokenize, ssplit, pos, lemma, ner, parse, dcoref -outputFormat text. Проблема здесь в том, что кавычки вокруг звездочки, когда сбежали с обратным слэшем, конечно. Я попытался запустить другие java-программы с указанными аргументами, и они тоже не работают. Кроме того, спасибо за пример gnuplot. У меня есть требование для чего-то такого! –