重定向站点并同时在终端上打印。

4
由于{{link1:@Przemyslaw Szufel}提供的出色答案,我们可以轻松地将stdio输出重定向到指定路径下的文件中。
我想知道是否有可能同时将stdio输出重定向到文件和继续在终端中打印它。这可能是一个很容易实现的功能,但我找不到它!而且显然不能运行代码两次 :)

这可能有帮助:https://gist.github.com/mkitti/e4f7d2a0ed00f1b7ca9d37838f7011dd - Dan Getz
1个回答

2
您需要一个 Tee Stream,例如 https://github.com/fredrikekre/TeeStreams.jl/。不幸的是,redirect_stdio 的接口不接受抽象的 IO 作为其输出流,它要求它是一个具体的 Julia 类型 IOStream。因此,似乎没有好的方法使用 redirect_stdio 通过流进行操作。
但是,redirect_stdio 接受套接字和命名管道,这是一种您可以考虑的方式(对于这个简单的任务来说有点复杂,也许有人会找到更优雅的解决方案)。
首先,您需要创建一个管道服务器,在您的 REPL 会话中异步运行(这是 Windows 的代码,对于 Linux,您可能需要从管道名称中删除 \\.\pipe\):
using Sockets 
srv = Sockets.listen(raw"\\.\pipe\TeePipe")
mystdout = stdout
@async begin
    open("log.txt", "w") do f
       sock = accept(srv)
       while !eof(sock)
           line = readline(sock)
           println(mystdout, line)
           flush(mystdout)
           println(f, line)
           flush(f)
       end
    end    
end

现在,在同一个 REPL 会话中创建客户端:
teelogger = Sockets.connect(raw"\\.\pipe\TeePipe")

这里是一个演示该方法可行的 REPL 会话示例:
julia> redirect_stdio(stdout=teelogger) do
              println("Line1")
              println("Line2")
              @show 3+4
       end
Line1
Line2
3 + 4 = 7
7

shell> more log.txt
Line1
Line2
3 + 4 = 7

我希望这可以使用Julia的基础功能完成,而不需要使用任何软件包! - JKHA
Julia在这里的API还没有完全完成。我记得其他语言,比如Java,曾经有内置的API来分割/合并流。而且redirect_stdio不接受IO抽象类型 :( - Przemyslaw Szufel
请参阅 https://dev59.com/RWgMtIcB2Jgan1znMKVn#69141668。 - Bill
Bill,如果@JKHA可以控制打印命令,我会选择来自https://github.com/JuliaLogging/LoggingExtras.jl的`TeeLogger`。 - Przemyslaw Szufel
TeeLogger是多才多艺的——我正在展示一种使用基本Julia进行tee输出的方法。 - Bill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接