Julia 动态使用

Julia 动态使用,julia,Julia,我想动态使用模块,我知道它们的名称,但创建一个模块,然后像这样应用: using PyPlot a = Module(:Plots) using a 将产生一个例外,告诉我a未定义。这是一个非常不直观的错误消息,因为当您在repl上执行此操作时,可以在之后使用“a”。仅结合使用它就表明它没有定义。错误消息是由Base.require发出的,因此您应该使用使用Main.a或使用.a: require(模块::符号) 如果尚未安装模块,则此函数是使用/导入实现的一部分 在Main中定义。也可以直接

我想动态使用模块,我知道它们的名称,但创建一个模块,然后像这样应用:

using PyPlot
a = Module(:Plots)
using a

将产生一个例外,告诉我a未定义。这是一个非常不直观的错误消息,因为当您在repl上执行此操作时,可以在之后使用“a”。仅结合使用它就表明它没有定义。

错误消息是由
Base.require
发出的,因此您应该使用
使用Main.a
使用.a

require(模块::符号)

如果尚未安装模块,则此函数是使用/导入实现的一部分 在Main中定义。也可以直接调用它来强制重新加载模块,而不考虑 以前是否加载过(例如,在交互式开发库时)。 ... 搜索文件时,require首先在Pkg.dir()下查找包代码,然后尝试路径 在全局数组中加载路径。require在所有平台上都区分大小写,包括具有 不区分大小写的文件系统,如macOS和Windows

或者只需使用
module
关键字动态定义模块:

module A
...
end

using A

对于现有模块,您还可以通过
eval(使用模块名称)

动态使用它,谢谢。评估完全符合我的要求。注意这里的
eval
。只能在REPL或非预编译包中这样使用它。预编译不是为这种动态使用而设计的。因此,如果您这样做是为了避免将包作为依赖项。。。不要。(此外,如果要跳过Plots.jl依赖项,则任何包都不应直接使用Plots.jl,而应依赖RecipesBase.jl)。@ChrisRackauckas如果我还不知道依赖项是什么(在编译时),我还能怎么做呢?那么不要预编译,或者以不同的方式进行设计。你对什么包装有这个问题?它不应该是绘图,因为没有任何包应该直接依赖于它。我明白了,那么你就只能这样了。这是一个非常动态的工作流,因此如果您不预编译包,这可能不会始终有效。它的工作频率可能足够高,您可以侥幸逃脱,但如果您遇到问题,禁用预编译可能是第一件要尝试的事情。祝你好运