2017-06-15 62 views
2

我要动态地使用模块,我知道他们的名字,但创建一个模块,然后使用这样的应用:使用使用动态

using PyPlot 
a = Module(:Plots) 
using a 

将产生错误时抛出告诉我,一个不definied。这是一个非常不直观的错误信息,因为当你在repl上这样做时,你可以使用'a'。结合使用它会告诉你它没有被定义。

回答

3

该错误消息是由Base.require发出的,所以你应该使用using Main.ausing .a代替:

要求(模块::符号)

此功能使用/进口实施的一部分,如果模块不是已经在Main中定义的 。它也可以直接调用以强制重新加载模块,而不管其是否已在之前加载(例如,在交互式开发库时),而不管它是否为 。 ... 当搜索文件,都需要先查找下Pkg.dir()包代码,然后尝试在全局变量LOAD_PATH路径 。在所有平台上都需要区分大小写,包括那些不区分大小写的文件系统(如macOS和Windows)的文件系统( )。

或者只是使用module关键字来定义在飞行模块:

module A 
... 
end 

using A 

对于现有的模块,你也可以通过动态eval(using module-name)使用它。

+0

谢谢。 eval正是我想要的。 – Nozdrum

+0

这里提防'eval'。只能在REPL中或在未预编译的包中使用它。预编译不是为这种动态使用而设计的。所以,如果你这样做是为了避免必须有一个软件包作为依赖......不要。 (另外,如果跳过Plots.jl依赖项,则不应该直接使用Plots.jl,而应该依赖于RecipesBase.jl)。 –

+0

@ChrisRackauckas如果我不知道什么是依赖关系(在编译时),我该怎么做呢? – Nozdrum