2016-09-01 22 views
4

所以,我真的得到了一个程序,使用劣质shell从SBCL Lisp运行(推测UIOP将会很好)。无论如何,现在我可以做到这一点,如果它在后台运行,我仍然不知道如何与程序进行交互。Inferior Shell或UIOP:与后台进程交互

所有这些功能(如管道和流连接到运行程序的标准输入和标准输出都会被公布,只是没有记录)。看起来这是最基本的事情。

有没有人有做这样的事情的例子?

任何帮助表示赞赏。

-Todd

+1

这可能是一个太宽泛的问题。你有一个简单的例子来展示吗?哪些东西不符合您的预期? – 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

我想你只需要创建流,并通过:input:output:error参数它们传递到RUN-PROGRAM

这里是一个例子,我给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,引理,ner,parse,dcoref -outputFormat text当然,这里的问题是星号周围的引号,当用反斜线转义时。我试过用引用的参数运行其他Java程序,但它们也不工作。另外,感谢gnuplot的例子。我确实有这样的要求! –