【问题标题】:Load Julia modules on demand按需加载 Julia 模块
【发布时间】:2019-04-05 08:37:40
【问题描述】:

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

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

目前这意味着我在顶层有一个像using PyPlot 这样的语句,这需要相当长的时间来加载。

(是的,我知道:不应该经常重启 Julia,bla bla bla ......但这是一个令人烦恼的点)

有没有办法确保仅在实际需要时才加载 PyPlot? 最简单的想法是将using PyPlot 包含在实际执行绘图的函数中

function my_plot()
    using PyPlot
    plot(1:10,1:10)
end

但这会导致语法错误:

ERROR: syntax: "using" expression not at top level

那么,还有其他方法可以实现吗?

【问题讨论】:

  • 你可以在全局范围内eval using expr。
  • @Gnimuc 感谢您的评论,但我不明白您的意思。你能举个例子吗?
  • using PyPlot之前添加@eval

标签: matplotlib julia


【解决方案1】:

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

如果您将 using 语句作为 Julia eval 语句中的表达式调用,则在 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 放在一个函数中时,无论如何它都找不到 PyPlot:我有:@eval using PyPlot ; clf() 并得到“错误:LoadError:MethodError:没有方法匹配 clf() 适用的方法可能太新:在世界时代运行25167,而当前世界是 25173。”在代码中的其他地方,我一直运行 using PyCall 这就是为什么我仍然会发生冲突吗?
  • clf() 是一个 PyPlot 函数。错误消息意味着引用 PyPlot 例程的代码是在运行 using PyPlot 之前编译的。您可以找到生成错误的函数并在遇到该代码之前运行 using 语句,但是由于这可能无法弹性地进一步重构您的代码,因此出现此错误意味着您应该只在顶部运行 PyPlot。,
  • 我应该补充一点,有时在调用 clf() 的代码中将 clf 指定为 PyCall,clf() 也可能有效,因为 PyPlot() 可能会更改 clf() 的引用在程序运行时从 PyCall.clf 到 PyPlot.clf()。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多