Dynamic 如何使用Julia 1.5在运行时动态加载模块(或脚本)

Dynamic 如何使用Julia 1.5在运行时动态加载模块(或脚本),dynamic,module,julia,Dynamic,Module,Julia,我想知道是否可以定义模块(或脚本) 及 动态加载它们并调用它们的标准辅助函数,如 function foo() ... modname = "SomeName" # in practice we would call something like retrievename() mod = import( modname ) # imports the module (or includes the script) mod.w

我想知道是否可以定义模块(或脚本)

动态加载它们并调用它们的标准辅助函数,如

function foo() 
    ...
    modname = "SomeName"    # in practice we would call something like retrievename() 
    mod = import( modname ) # imports the module (or includes the script)
    
    mod.worker()            # calls the worker function
end
该功能应类似于LINUX上的Libdl.dlopen()、Libdl.dlsym()或Windows上的LoadLibrary()、GetProcAddress()的动态加载。但我想对茱莉亚来说可能更优雅


在模块和脚本中学习这一点是很有意思的。

您可以这样做,但考虑到Julia如何将编译与多分派相结合,这是一个坏主意

假设您有以下文件:

shell> more Foo3.jl
module Foo3
    export hello
    hello() = "hello3"
end
现在您可以拥有以下功能:

function foo(m::AbstractString)
    include(m * ".jl")
    Main.eval(Meta.parse("using Main.$m"))
    mod = getfield(Main, Symbol(m))
    Base.invokelatest(mod.hello)
end
请注意,在这种情况下,不可能简单地编译
foo
函数,因此我们必须使用
Base.invokelatest

现在您可以测试它:

julia> foo("Foo3")
"hello3"
我通常会加载所有模块(将它们作为Julia包),然后动态选择,如下面的示例所示:

julia> getfield(Main, Symbol("Foo3")).hello()
"hello3"

很好,谢谢,很好用。对于动态加载的模块而不是脚本,情况会如何?(对于小型脚本,如果要替换不停止服务器进程的计算例程,这是有意义的)只需删除
include
行即可。代码的其余部分是关于模块的。
julia> foo("Foo3")
"hello3"
julia> getfield(Main, Symbol("Foo3")).hello()
"hello3"