在以下示例中:
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 包的全局注册表的包版本进行检查就足够了。
谢谢!
你可以通过调用 C 函数将模块加载到另一个模块中jl_modules_using,我经常定义以下辅助 Julia 绑定:
modules(m::Module) = ccall(:jl_module_usings, Any, (Any,), m)\nRun Code Online (Sandbox Code Playgroud)\n请注意,这仅适用于通过 via 引入的内容using,而不是 via 引入的内容import,例如:
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\nRun Code Online (Sandbox Code Playgroud)\n如果您想更准确地测试模块是否已加载(但没有导入者的信息),您可以使用Base.loaded_modules:
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\nRun Code Online (Sandbox Code Playgroud)\n遗憾的是,我不确定为什么我们没有一个很好的模块列表,这些模块的绑定已导入到另一个模块中。我建议在 Julia 跟踪器上打开一个问题,询问是否需要它,可能有一种我自己不知道的简单方法来获取它。
\n