我想将程序中的一些数据发送到通过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程序生成的数据作为标准输入传递?
答案 0 :(得分:5)
仔细研究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
,在本例中为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(命名管道)。