Julia 如何退出/退出终端中包含的文件

Julia 如何退出/退出终端中包含的文件,julia,Julia,我可以在文件“example.jl”中执行什么操作来退出/返回对命令行中include()的调用 julia> include("example.jl") 没有朱莉娅本身quit()只会终止julia本身 编辑:对我来说,这在交互开发代码时很有用,例如,当满足某个条件时,包含一个测试文件并从执行返回到julia提示符,或者只编译我当前正在处理的测试,而不重新组织代码。我不太确定您要做什么,但听起来您最好将代码作为函数编写,并使用返回来退出。您甚至可以在include中调用函数。@Dani

我可以在文件
“example.jl”
中执行什么操作来退出/返回对命令行中
include()
的调用

julia> include("example.jl")
没有朱莉娅本身
quit()
只会终止julia本身


编辑:对我来说,这在交互开发代码时很有用,例如,当满足某个条件时,包含一个测试文件并从执行返回到julia提示符,或者只编译我当前正在处理的测试,而不重新组织代码。

我不太确定您要做什么,但听起来您最好将代码作为函数编写,并使用
返回来退出。您甚至可以在include中调用函数。

@DanielArndt是正确的

只需在include文件中创建一个伪函数,并将所有代码放入其中(之前将放置的其他函数和变量声明部分除外)。因此,您可以根据需要使用
return
。仅在本地上下文中使用的变量可以保留在伪函数中。然后,它只是在最后调用新函数

假设前面的代码是:

function func1(...)
....
end

function func2(...)
....
end

var1 = valor1
var2 = valor2
localVar = valor3  
1st code part
# I want exit here! 
2nd code part 
您的代码如下所示:

var1 = valor1
var2 = valor2

function func1(...)
....
end

function func2(...)
....
end


function dummy()    
  localVar = valor3  
  1st code part
  return  # it's the last running line! 
  2nd code part 
end 

dummy()
另一种可能是将顶部变量放置在带有
全局前缀的函数中

function dummy()    
  global var1 = valor1
  global var2 = valor2
  ...
end 
全局变量可以在辅助函数(静态范围)内部使用,也可以在
REPL

另一个变体只声明变量,它的后期使用是免费的

function dummy()    
  global var1, var2
  ... 
end 

克里斯托弗不会喜欢的,但是

stop(text="Stop.") = throw(StopException(text))

struct StopException{T}
    S::T
end

function Base.showerror(io::IO, ex::StopException, bt; backtrace=true)
    Base.with_output_color(get(io, :color, false) ? :green : :nothing, io) do io
        showerror(io, ex.S)
    end
end
将给出一个好的,不那么令人担忧的信息,而不仅仅是抛出一个错误

julia> stop("Stopped. Reason: Converged.")
ERROR: "Stopped. Reason: Converged."

来源:

您在Julia中可能需要调试工作流。如果您使用
Revise.jl
Rebugger.jl
您可以完全按照自己的要求执行

您可以输入断点并单步执行包含文件中的代码

如果您从julia提示符中包含了一个文件,并且希望由
revision.jl
跟踪该文件,则需要使用
includet(

Rebugger
中的键盘快捷键允许您迭代和检查变量,修改代码,并从包含的文件中使用实际值重新运行代码

Revise
允许您重新加载函数和模块,而无需重新启动julia会话来获取更改

这种组合非常强大,Tim Holy对其进行了深入的描述

请注意,Review有一些限制,例如它不会重置全局变量,因此如果您使用一些全局计数或其他东西,它不会在下一次运行或返回时重置它。此外,
runtests.jl
Test
包也不太好。因此,当您使用Review进行开发时完成后,将其移动到
runtests.jl中

此外,Juno IDE(Atom+
uber Juno
package)对代码检查和逐行运行有很好的支持,并且调试最近得到了一些很好的支持。我从julia提示符使用的Rebugger比从Juno IDE使用的要多


希望这能有所帮助。

您能详细解释一下您试图解决的实际问题是什么吗?如果您这样做,我们可能会提供更好的答案,因为听起来您并没有按照预期使用
include
。您可以使用
error
throw
引发异常。我最初的回答中有异常,但我把它拿走了。我想那是(可能是)屠宰
try..catch
控制路径…也许,更详细地说,这可能是一个更合理的解决方案。引发异常是一个好主意,因为它会爆发到正确的级别。在不滥用异常控制路径的情况下进行同样的操作会很好,但这对我来说是可行的。我使用了
错误(“停止”)
按照@VincentZoonekynd的建议,在不退出julia环境的情况下成功退出脚本的执行。如果该函数是从另一个函数调用的,它将向上返回对该函数的控制,而不会停止执行可能导致真正错误的语句。问题在于从REPL运行.jl文件,并从任意点中断。这实际上是我迄今为止发现的最好的一个。我一直在使用error或
throw
,但堆栈跟踪确实不和谐。这实际上仍然提供堆栈跟踪,尽管只有一行:
error:LoadError:“Stop”在表达式中,从/path/to/file/julia script.jl:51开始。不过,非常感谢!感谢分享,这很好。不过,这是一个非常重要的解决方案,可以解决提问者用例中非常随意的问题。我的问题,这就是为什么我喜欢@mschauer自己的答案。