12

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

Pkg.status()列出所有已安装的软件包。using ...我对通过或导入/加载的那些感兴趣import ...

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

4

8 回答 8

9

使用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
于 2014-08-29T20:59:00.800 回答
6
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 ≠ Lazyfilter以避免包含它。

于 2014-08-31T14:10:01.800 回答
6

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

filter((x) -> typeof(eval(x)) <:  Module && x ≠ :Main, names(Main,imported=true))
于 2018-10-28T10:24:51.983 回答
5

我非常喜欢Przemyslaw 的回答,只想对其稍作修改,将显式替换为:Main可选参数(作为新手,我不允许输入评论)

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

于 2019-09-16T12:26:50.853 回答
3

所以这不是一个单行的好,但是:它适用于v1.0,它允许一个简单的递归搜索来显示所有加载的模块:

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
于 2019-04-30T02:23:15.440 回答
2
 Base.loaded_modules_array()

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

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

是一个包含所有已加载模块的字典,loaded_modules_array 从中生成其输出。

于 2020-08-03T21:05:22.133 回答
1

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

children(SIUnits) -> SIUnits.ShortUnits 

但是大多数包(我使用的)实际上并没有定义 submodules 。我发现这对调试很有用,在 Julia 命令行版本和一分钟的优秀 Juno IDE 中:

loadedmodules() = filter(names(Main, false)) do n 
                                          isa(eval(n), Module) && n ≠ Main
                                        end
于 2016-12-26T19:25:15.107 回答
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
于 2018-04-04T08:09:54.280 回答