Common Lisp:uiop:run-程序输出但uiop:launch-程序不输出

Common Lisp: uiop:run-program outputs but uiop:launch-program does not

基本上,

(uiop:run-program "echo hello" :output *standard-output*)

输出 hello,而 none 的

(uiop:launch-program "echo hello" :output *standard-output*)
(uiop:launch-program "echo hello" :output #.*standard-output*)
(uiop:launch-program "echo hello" :output :interactive)

输出任何东西;但是,如果我这样做 运行

(uiop:run-program "echo hello" :output *standard-output*)

在他们之后,我得到 hello 4 次表明 echo hello 做了 运行。为什么会这样? ((force-output) 也没有任何改变。)

编辑:我正在使用 SBCL 和 SLIME。正如评论中所建议的那样,这在 运行 从终端上按预期工作(我得到了输出)。

当您查看 run-programlaunch-program 的实现时,您会发现前者(在本例中……)执行 wait-process.

如果您在 launch-program 编辑的进程信息 return 上发出 uiop:wait-process,则会出现您的输出。

我猜这是一种竞争条件,swank 或 slime 在执行其他操作之前无法获取输出。我认为这是 launch-program.

异步 行为所固有的

我认为获得输出的最清晰的方法是指定 :output :stream,然后使用在 launch-program 的 return 值上调用 process-info-output 可用的流.