朱莉娅:找出是否从REPL或命令行运行

时间:2019-12-06 23:59:52

标签: julia read-eval-print-loop

是否有办法确定是否已从命令行通过myprog.jl调用了茱莉亚脚本julia myprog.jl或通过include("myprog.jl")从REPL调用了此脚本?

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

的内容
if called_from_repl
    parse_args(split(ARGS),s)
else
    parse_args(s)
end

2 个答案:

答案 0 :(得分:6)

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

考虑以下示例(我将$用于命令行提示符,将julia>用于Julia REPL提示符)

$ more test.jl

println("interactive : $(isinteractive())")


$ julia test.jl
interactive : false

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

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

答案 1 :(得分:3)

是的,这是可能的。 Base定义常量extension String { func retrieveFirstCharacter() -> String? { guard self.count > 0 else { return nil } let numberOfCharacters = self.count return String(self.dropLast(numberOfCharacters - 1)) } } ,该常量包含在命令行中传递的脚本名称。宏Base.PROGRAM_FILE的值等于调用该宏的脚本的路径。

表达式Base.@__FILE__在通过命令行传递的脚本中计算为true,但对于包含的脚本为false。

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