Список загруженных/импортированных пакетов в Julia

Как я могу получить список импортированных/используемых пакетов сеанса Julia?

Pkg.status() список всех установленных пакетов. Меня интересуют те, которые были импортированы/загружены через using ... или import ...

Кажется, что whos() содержит соответствующую информацию (имена и является ли это модулем или нет). Можно ли захватить вывод whos() в переменной?

Ответ 1

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

Используйте 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

Ответ 3

Предложенные ответы не работают с Julia 1.0 и, следовательно, вот версия Julia 1.0:

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

Ответ 4

Ответ выше уже не работает, как и раньше, в 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

Я использую,

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

Так что это не так приятно с одной строкой, но: он работает на 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