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

时间:2018-07-14 20:04:26

标签: common-lisp graphviz sbcl

我想将程序中的一些数据发送到通过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)))

这似乎有点令人费解。

一个更简单的版本,其中我仅使用一个流而不使用finish-output并且不使用:close-stream标签导致dot产生了一个空的0字节文件。

如何执行流程并将lisp程序生成的数据作为标准输入传递?

1 个答案:

答案 0 :(得分:5)

仔细研究uiop:launch-programuiop:run-program的文档,尤其是:input:output键的选项。

您可以使用launch-program呼叫:input :streamLaunch-program返回一个过程信息对象,该对象包含在访问者process-info-input后面的连接到该程序的标准输入的流,因此您可以对其进行打印。

如果您使用其他程序生成应输入该输入流的输出,则可以使用以下几种选择:

  • 创建一个临时文件,然后读取它并将其打印到第二个程序的输入流中(这似乎是您当前的方法)
  • 第一次调用时,将run-program:output :string一起使用,然后将launch-program:input :streamlaunch-program一起使用,并将第一个的输出写入该流中
  • 在第一次调用中也使用:output :stream,在本例中为Public Sub test() Dim book1 As Workbook, recordsht As Worksheet, m As Long Set book1 = Workbooks("planning design 2.xlsm") Set recordsht = book1.Worksheets("Records") m = 5 recordsht.Range("B" & m) = 34 End Sub ,然后从该输出中读取并将其打印到第二个程序的输入中

您可以先阅读所有内容,然后再编写所有内容,或者可以进行缓冲的读写,这对于长时间运行的进程可能很有趣。

除了此进程内缓冲之外,您还可以在操作系统中使用fifo(命名管道)。