julia - 使用 Julia 0.5.1 的顺序输入运行外部程序

标签 julia

我想运行一个外部程序,我们称其为程序,按顺序将输入传输到其标准输入。让我们调用输入 input_1input_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/

相关文章:

serialization - Julia:serialize()/deserialize() 有多稳定

types - Julia 中动态变量和静态变量的区别

dependencies - Julia:创建具有可选依赖项的包

julia - 如何在Julia的导入路径中添加本地项目?

Julia 相当于 Python 的 "help()"

macros - Julia 中宏生成宏中的转义表达式

plot - Julia:网格上分类数据的可视化

julia - 为什么我的 Julia 程序使用这么多内存?

oop - Julia:在类型中嵌入函数的构造函数

julia - 如何在 Flux.jl 中使用 .pth 模型?