如何通过临时文件将数据传输到其他进程

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程序生成的数据作为标准输入传递?

Sva*_*nte 5

采取在的文档仔细一看uiop:launch-programuiop: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(命名管道)代替此进程内缓冲.