Julia中加载/导入的包列表

时间:2014-08-29 20:00:09

标签: julia reproducible-research

如何获取Julia会话的导入/使用包列表?

Pkg.status()列出所有已安装的软件包。我对通过using ...import ...

导入/加载的内容感兴趣

似乎whos()包含相关信息(名称以及是否为模块)。可以在变量中捕获whos()的输出吗?

8 个答案:

答案 0 :(得分:6)

使用names,例如

julia> using JuMP

julia> using Gurobi

julia> names(Main)
13-element Array{Symbol,1}:
 :Calculus
 :ans
 :JuMP
 :DualNumbers
 :Graphs
 :DataStructures
 :ReverseDiffSparse
 :MathProgSolverInterface
 :Base
 :MathProgBase
 :Core
 :Gurobi
 :Main

答案 1 :(得分:4)

using Lazy
children(m::Module) =
  @>> names(m, true) map(x->m.(x)) filter(x->isa(x, Module) && x ≠ m)
然后

children(Main)将为您提供当前加载的模块列表。


编辑:我在这里使用了Lazy.jl作为画眉宏(@>>),但你可以轻松地重写它:

children(m::Module) =
  filter(x->isa(x, Module) && x ≠ m, map(x->m.(x), names(m, true)))

或者,您可以将&& x ≠ Lazy添加到filter以避免包含它。

答案 2 :(得分:2)

 Base.loaded_modules_array()

为您提供Julia加载的任何模块。

Base.loaded_modules::Dict{Base.PkgId,Module}

是所有已加载模块的字典,loaded_modules_array将从其生成输出。

答案 3 :(得分:1)

建议的答案不适用于Julia 1.0,因此这是Julia 1.0版本:

filter((x) -> typeof(eval(x)) <:  Module && x ≠ :Main, names(Main,imported=true))

答案 4 :(得分:0)

上面的答案在Julia 0.5中不再像以前那样有效。它适用于许多情况,例如:

children(SIUnits) -> SIUnits.ShortUnits 

但是大多数软件包(我使用的)实际上并没有定义子模块。我认为这对于调试很有用,可以在Julia命令行版本和一分钟内出色的Juno IDE中使用:

loadedmodules() = filter(names(Main, false)) do n 
                                          isa(eval(n), Module) && n ≠ Main
                                        end

答案 5 :(得分:0)

我用,

using Pkg
function magic()
    println("Julia " * string(VERSION))
    for (key, version) ∈ sort(collect(Pkg.installed()))
        try
            isa(eval(Symbol(key)), Module) && println(key * " " * string(version))
        end
    end
end

答案 6 :(得分:0)

因此,这不是单线的好方法,而是: 它可以在v1.0上运行,并且允许进行简单的递归搜索以显示 all 加载的模块:

function children(m::Module)
    ns = names(m, imported=true, all=true)
    ms = []
    for n in ns
        if n != nameof(m)
            try
                x = Core.eval(m, n)
                x isa Module && push!(ms, x)
            catch end
        end
    end
    ms
end

function children_deep(m::Module)
  cs = children(m)
  for c in cs
      cs = union(cs, children(c))
  end
  cs
end

然后:

julia> children_deep(Main)
43-element Array{Any,1}:
 Base
 Core
 InteractiveUtils
 Base.BaseDocs
 Base.Broadcast
 Base.Cartesian
 Base.Checked
 Core.Compiler.CoreDocs
 ⋮
 Base.Sys
 Base.Threads
 Base.Unicode
 Base.__toplevel__
 Core.Compiler
 Core.IR
 Core.Intrinsics
 Main

答案 7 :(得分:0)

我非常喜欢Przemyslaw's答案,只是想对其进行一点修改,用一个可选参数代替显式:Main(作为新手,我不允许输入评论)< / p>

loadedModules(m::Module = Main) = filter(x -> eval(x) isa Module && x ≠ Symbol(m), names(m, imported = true))