Kas*_*erg 4 sbcl common-lisp graphviz
我想从我的程序中将一些数据发送到通过执行的进程uiop:run-program.
以下作品:
(require :asdf)
(asdf:load-system :uiop)
(uiop:with-temporary-file (:stream dot-program-stream
:pathname dot-program-file)
(format dot-program-stream "digraph g { n1 -> n2; }")
(finish-output dot-program-stream)
:close-stream
(uiop:with-temporary-file (:pathname png-data)
(uiop:run-program '("/usr/bin/dot" "-Tpng") :input dot-program-file
:output png-data)
(uiop:launch-program '("/usr/bin/display") :input png-data)))
Run Code Online (Sandbox Code Playgroud)
这似乎相当复杂.
一个更简单的版本,我只使用了一个流没有,finish-output并且没有使用:close-stream标签导致产生dot一个空的0字节文件.
如何执行一个进程并将我的lisp程序生成的数据作为标准输入传递?
采取在的文档仔细一看uiop:launch-program和uiop:run-program,尤其是对的选项:input和:output按键.
您可以致电launch-program与:input :stream. Launch-program返回一个进程信息对象,该对象包含连接到该程序在访问器后面的标准输入的流process-info-input,因此您可以打印到该对象.
如果你有一个不同的程序产生应该进入该输入流的输出,你有几个选择:
run-program与:output :string用于第一呼叫,然后使用launch-program与:input :stream用于所述第二和第一输出写入到该流launch-program也是第一个呼叫,在这种情况下使用:output :stream,然后从输出读取并打印到第二个程序的输入您可以先读取所有内容,然后编写所有内容,也可以进行缓冲读取和写入,这对于长时间运行的进程可能很有用.
您也可以使用操作系统中的fifo(命名管道)代替此进程内缓冲.
| 归档时间: |
|
| 查看次数: |
171 次 |
| 最近记录: |