2014-08-29 7 views
7

Wie kann ich eine Liste der importierten/verwendeten Pakete einer Julia-Sitzung erhalten?Liste der geladenen/importierten Pakete in Julia

Pkg.status() Liste aller installierten Pakete. Ich bin in die, die daran interessiert, dass die importiert/geladen über using ... oder import ...

Es scheint, dass whos() die relevanten Informationen enthält (die Namen und ob es sich um ein Modul, oder nicht). Kann die Ausgabe von whos() in einer Variablen erfasst werden?

Antwort

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

children(Main) Sie erhalten dann eine Liste der Module geben zur Zeit geladen.


Edit: benutzte ich Lazy.jl hier für die Soor-Makro (@>>), aber Sie können es neu schreiben, ohne leicht genug:

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

Alternativ Sie && x ≠ Lazy zum filter hinzufügen könnte vermeiden Sie es.

+0

Funktioniert wie ein Charme. Ist es möglich, auf Lazy zu verzichten? Weil es im Moment die Liste der geladenen Module ändert, die wir bekommen wollen. – Julian

+0

Sicher, Antwort aktualisiert. –

+0

Sieht gut aus! "Lazy" manuell zu entfernen, würde in unserem Fall nicht funktionieren, da wir es immer noch erfassen wollen, wenn es nicht von uns geladen wurde. Ihre zweite Lösung spricht das alles gut an. – Julian

5

Verwendung names, z.B.

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 
+0

Okay, das scheint ein guter Anfang zu sein. Ist es möglich, es nur auf die Pakete zu beschränken? Dies beinhaltet im Moment auch die Variablen im Arbeitsbereich, die mit einem Paketnamen kollidieren könnten (stellen Sie sich eine Variablenzuweisung 'Distributionen = 1' vor, die mit einem geladenen Paket verwechselt werden kann). – Julian

+0

Ich denke nicht, dass es möglich ist, aber jemand kann etwas wissen, was ich nicht – IainDunning

+0

Aus Neugier, warum willst du wissen, wie das geht? – IainDunning

0

Die obige Antwort funktioniert nicht mehr wie bisher in Julia 0.5. Es funktioniert in vielen Fällen, z. B .:

children(SIUnits) -> SIUnits.ShortUnits 

Aber eine Mehrheit der Pakete (die ich verwende) nicht wirklich Submodule definieren. Ich finde dies nützlich für das Debuggen, in der Julia-Befehlszeilenversion und in der exzellenten Juno-IDE:

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