我想运行一个外部程序,我们称其为程序
,按顺序将输入传输到其标准输入。让我们调用输入 input_1
、input_2
等。
然后,我希望将程序的标准输出通过管道传输回内存,例如 Julia 数据结构,或者如果不可能,则写入文本文件。
我可以运行外部程序:
run(`program input_1 input_2`)
这会导致程序的标准输出显示到 shell。
但是,我需要按顺序提供输入,因此无法使用此方法。
我看过External Programs文档页面,我相信我应该使用 open
函数,但我不知道如何使用它。
当我运行时:
open(`program`)
外部程序提示没有输入就无法运行。
This博客文章内容非常丰富,我相信类似:
(si,pr) = writesto(`program`)
write(si,input_1)
...
write(si, input_2)
可能适用于较旧版本的 Julia,但 writeto
函数已被弃用,如 here 中所述。 .
此外,我希望该程序在后台运行。目前它产生了一个新的终端窗口。我认为这可能是外部程序的一个函数,所以我不确定这是否可以在 Julia 中指定。
最佳答案
您可能想看看我最终在 Gaston(基于 gnuplot 的绘图程序)中实现了什么。我需要启动 gnuplot,然后通过其 stdin 向其发送命令,同时通过 stdout 读取其输出并通过 stderr 读取任何错误。
我实现了一个 popen3
函数,该函数执行命令并将管道返回到 stdin、stdout 和 stderr。函数在这里:https://github.com/mbaz/Gaston.jl/blob/master/src/gaston_aux.jl#L431
然后,我使用异步任务访问 gnuplot 的 stdout 和 stderr 管道(因为从它们读取是阻塞的)。您可以在这里看到发生的情况:https://github.com/mbaz/Gaston.jl/blob/master/src/gaston_aux.jl#L5一直到第 52 行。
编辑(2019 年 6 月):
Julia 1.x 中的最佳解决方案是构建 pipeline
连接管道,然后run
执行管道。请参阅here对于 Gaston 当前的实现。
不幸的是,Pipe
的文档仍然不存在,所以我仍然认为这个解决方案是非官方的。
关于julia - 使用 Julia 0.5.1 的顺序输入运行外部程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42894447/