gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 03:00:27 25 4
gpt4 key购买 nike

我想将一些数据从我的程序发送到通过 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 程序生成的数据作为标准输入传递?

最佳答案

仔细查看 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(命名管道)。

    关于common-lisp - 如何通过临时文件将数据传输到其他进程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51342950/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com