【问题标题】:Julia shell mode in a .jl file.jl 文件中的 Julia shell 模式
【发布时间】:2021-06-11 21:45:29
【问题描述】:

在 REPL 模式下,Julia 允许您键入分号并运行 shell 命令,即

;
cd ~

然后回到 Julian REPL

有没有办法在 .jl 文件中做类似的事情?我找到的最接近的是run(…),它有很多警告。这是一个 Linux 环境,所以我不关心 Windows 机器上 shell 模式的注意事项。

更广泛的兴趣主题是为其他 REPL 模式执行此操作,例如 using RCall 提供的 R 模式

【问题讨论】:

  • run 有哪些警告会妨碍您?

标签: julia


【解决方案1】:

正如您所提到的,默认方法是通过run 命令。如果您还没有,请查看此 https://docs.julialang.org/en/v1/manual/running-external-programs/#Running-External-Programs 上的文档,其中包含一些警告。

我不确定我是否遵循您对 RCall 的看法,但也许值得为此单独提出一个问题。

【讨论】:

  • 我认为他的意思是使用RCall,您可以键入$ 以获得新提示,但您也可以通过R"" 字符串宏直接使用R
  • 字符串宏是RCall的解决方案,我猜使用run是shell推荐的解决方案
【解决方案2】:

您可以在 https://github.com/JuliaLang/julia/tree/master/stdlib/REPL/test 找到此代码。

似乎没有 API,只是打字很多。

这是一个最小的工作示例(代码大部分是从上面文件夹的不同位置复制的):

using REPL
mutable struct FakeTerminal <: REPL.Terminals.UnixTerminal
    in_stream::Base.IO
    out_stream::Base.IO
    err_stream::Base.IO
    hascolor::Bool
    raw::Bool
    FakeTerminal(stdin,stdout,stderr,hascolor=true) =
        new(stdin,stdout,stderr,hascolor,false)
end

REPL.Terminals.hascolor(t::FakeTerminal) = t.hascolor
REPL.Terminals.raw!(t::FakeTerminal, raw::Bool) = t.raw = raw
REPL.Terminals.size(t::FakeTerminal) = (24, 80)

input = Pipe()
output = Pipe()
err = Pipe()
Base.link_pipe!(input, reader_supports_async=true, writer_supports_async=true)
Base.link_pipe!(output, reader_supports_async=true, writer_supports_async=true)
Base.link_pipe!(err, reader_supports_async=true, writer_supports_async=true)
repl = REPL.LineEditREPL(FakeTerminal(input.out, output.in, err.in, false), false)

repltask = @async REPL.run_repl(repl)

现在你可以这样做了:

julia> println(input,";ls -la *.jld2")

-rw-r--r-- 1 pszufe 197121 5506 Jul  5  2020 file.jld2
-rw-r--r-- 1 pszufe 197121 5506 Jul  5  2020 myfile.jld2

【讨论】:

    猜你喜欢
    • 2014-04-10
    • 2021-06-22
    • 2020-12-09
    • 1970-01-01
    • 2016-09-30
    • 2018-01-30
    • 1970-01-01
    • 2017-11-03
    • 1970-01-01
    相关资源
    最近更新 更多