是否有办法确定是否已从命令行通过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
答案 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