朱莉娅:了解是从 REPL 还是命令行运行



有没有办法确定 julia 脚本myprog.jl是通过julia myprog.jl从命令行调用的,还是通过include("myprog.jl")从 REPL 调用的?

背景:我正在使用 ArgParse.jl 包,由于我无法从 REPL 传递命令行参数,因此我想在调用include("myprog.jl")之前设置一个变量ARGS = "argA --optB 1 --flagC",以实现与从命令行julia myprog.jl argA --optB 1 --flagC相同的结果。为此,我需要知道程序是从命令行还是从 REPL 调用的,这样我就可以编写类似的东西

if called_from_repl
parse_args(split(ARGS),s)
else
parse_args(s)
end

只需使用isinteractive来确定 Julia 是否正在运行交互式会话。

考虑下面的示例(我使用$作为命令行提示符,julia>用于 Julia REPL 提示符(

$ more test.jl
println("interactive : $(isinteractive())")

$ julia test.jl
interactive : false

现在让我们在 REPL 中运行相同的脚本:

julia> include("test.jl")
interactive : true

是的,这是可能的。Base 定义常量Base.PROGRAM_FILE其中包含在命令行上传递的脚本名称。宏Base.@__FILE__计算为调用此宏的脚本的路径。

表达式在命令行传递的脚本中abspath(PROGRAM_FILE) == @__FILE__计算结果为 true,但对于包含的脚本,表达式的计算结果为 false。

此技术在 Julia Lang 文档中进行了讨论:https://docs.julialang.org/en/latest/manual/faq/#man-scripting-1

最新更新