如何获取给定模块导入的模块列表

Bog*_*ski 5 julia

在以下示例中:

julia> module M
       using DataStructures
       end
Main.M

julia> names(Main.M, all=true, imported=true)
5-element Array{Symbol,1}:
 Symbol("#eval")
 Symbol("#include")
 :M
 :eval
 :include
Run Code Online (Sandbox Code Playgroud)

我们看到,如果没有导出模块(在我们的示例中)导入names的模块(在本示例中DataStructures),则不会列出它们的名称Main.M。我的问题是如何获取给定模块导入的模块列表。

另一个问题是如何检查此类模块的来源是什么(请注意,使用 egPkg.dependencies对它来说是不够的,因为该模块可能已先加载,然后 Julia 会话的活动环境可能已更改)。如果第二个问题总体上没有很好的答案,那么我对 UUID 和来自 Julia 包的全局注册表的包版本进行检查就足够了。

谢谢!

sta*_*oat 3

你可以通过调用 C 函数将模块加载到另一个模块中jl_modules_using,我经常定义以下辅助 Julia 绑定:

\n
modules(m::Module) = ccall(:jl_module_usings, Any, (Any,), m)\n
Run Code Online (Sandbox Code Playgroud)\n

请注意,这仅适用于通过 via 引入的内容using,而不是 via 引入的内容import,例如:

\n
julia> modules(m::Module) = ccall(:jl_module_usings, Any, (Any,), m)\nmodules (generic function with 1 method)\n\njulia> module Foo\n       import Pkg\n       end\n\n       modules(Foo)\n2-element Array{Any,1}:\n Base\n Core\n\njulia> module Bar\n       using Pkg\n       end\n\n       modules(Bar)\n3-element Array{Any,1}:\n Pkg\n Base\n Core\n
Run Code Online (Sandbox Code Playgroud)\n

如果您想更准确地测试模块是否已加载(但没有导入者的信息),您可以使用Base.loaded_modules

\n
julia> Base.loaded_modules\nDict{Base.PkgId,Module} with 33 entries:\n  SuiteSparse [4607b0f0-06f3-5cda-b6b1-a6196a1729e9]    => SuiteSparse\n  SharedArrays [1a1011a3-84de-559e-8e89-a11a2f7dc383]   => SharedArrays\n  REPL [3fa0cd96-eef1-5676-8a61-b3b8758bbffb]           => REPL\n  Mmap [a63ad114-7e13-5084-954f-fe012c677804]           => Mmap\n  \xe2\x8b\xae                                                     => \xe2\x8b\xae\n
Run Code Online (Sandbox Code Playgroud)\n

遗憾的是,我不确定为什么我们没有一个很好的模块列表,这些模块的绑定已导入到另一个模块中。我建议在 Julia 跟踪器上打开一个问题,询问是否需要它,可能有一种我自己不知道的简单方法来获取它。

\n