Matplotlib 按需加载模块

Matplotlib 按需加载模块,matplotlib,julia,Matplotlib,Julia,我有一个非常简单的问题。是否可以在Julia中按需加载模块。也就是说,模块可以在实际需要时加载,而不是在顶层的“解析时”加载 我想到的用例场景是,我有一组代码,可以使用PyPlot进行一些绘图,但代码远非总是执行的 目前,这意味着我在顶层有一个类似于的语句,使用PyPlot,这需要相当长的时间来加载 (是的,我知道:一个人不应该经常重启Julia,等等……但这是一个令人烦恼的问题) 是否有办法确保PyPlot仅在实际需要时加载? 最简单的想法是在实际进行绘图的函数中包含使用PyPlot的 fun

我有一个非常简单的问题。是否可以在Julia中按需加载模块。也就是说,模块可以在实际需要时加载,而不是在顶层的“解析时”加载

我想到的用例场景是,我有一组代码,可以使用PyPlot进行一些绘图,但代码远非总是执行的

目前,这意味着我在顶层有一个类似于
的语句,使用PyPlot
,这需要相当长的时间来加载

(是的,我知道:一个人不应该经常重启Julia,等等……但这是一个令人烦恼的问题)

是否有办法确保PyPlot仅在实际需要时加载? 最简单的想法是在实际进行绘图的函数中包含使用PyPlot的

function my_plot()
    using PyPlot
    plot(1:10,1:10)
end
但这会导致语法错误:

ERROR: syntax: "using" expression not at top level
那么,还有其他方法可以实现这一点吗?

当遇到代码行时,“using”语句会运行,并且不必位于文件的顶部。它确实需要在全局范围内,这意味着在执行“using”语句后,加载了“using”的模块中的变量将可用于程序中的所有函数,而不仅仅是函数的局部范围内可能出现的单个函数

如果在Julia eval语句中调用using语句作为表达式,那么在Julia中的“eval”语句中执行的所有代码都会在全局范围内自动执行,即使在函数的局部范围内以语法方式调用eval也是如此。因此,如果使用宏@eval

function my_plot()
    @eval using PyPlot  # or without the macro, as eval(:(using PyPlot))
    plot(1:10,1:10)
end

这就好像使用PyPlot是在函数外部完成的,因此避免了语法错误。

您可以
eval
在全局范围内使用
expr
。@gnimu谢谢您的评论,但我不明白您的意思。你能举个例子吗?在使用PyPlot之前添加
@eval
,谢谢你的回答。然而,现在出现了新的问题。当我把
@eval
放在一个函数中时,它无论如何都找不到PyPlot:我有:
@eval使用PyPlot;clf()
和get“ERROR:LoadError:MethodError:no method matching clf()适用的方法可能太新了:运行在世界年龄25167,而当前世界是25173。”在代码中的其他地方,我使用PyCall运行了aleary
这就是我仍然得到冲突的原因吗?clf()是PyPlot函数。错误消息表示引用PyPlot例程的代码是在运行using PyPlot之前编译的。您可以找到生成该错误的函数,并在遇到该代码之前运行using语句,但由于这可能无法进一步重构代码,因此获得该错误意味着您应该在顶部运行PyPlot。我应该补充一点,有时在调用clf()的代码中指定clf为PyCall,clf()由于PyPlot()可能会在程序运行时将clf()的引用从PyCall.clf更改为PyPlot.clf(),因此也可以使用。