2014-08-29 59 views
7

如何獲取Julia會話導入/使用的軟件包列表?Julia加載/導入的軟件包列表

Pkg.status()列出所有已安裝的軟件包。我感興趣的是那些已導入/通過using ...import ...

似乎whos()包含相關信息的加載(名稱以及它是否是一個模塊或沒有)。 whos()的輸出可以在變量中捕獲嗎?

回答

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))) 

另外,您可以到filter添加&& x ≠ Lazy到避免包含它。

+0

工程就像一個魅力。是否有可能不依靠懶惰呢?因爲目前它正在更改我們想要獲取的已加載模塊的列表。 – Julian 2014-08-31 19:20:26

+0

當然,答案已更新。 – 2014-09-01 00:34:10

+0

看起來不錯!手動刪除'Lazy'在我們的例子中不起作用,因爲如果它沒有被我們加載,我們仍然想要捕獲它。你的第二個解決方案很好地解決了這一切。 – Julian 2014-09-01 04:03:58

5

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

好的,這似乎是一個好的開始。是否有可能僅限於包裝?目前,這還包括工作空間中可能與包名衝突的變量(想象一下變量賦值'Distributions = 1',它可能與加載的包相混淆)。 – Julian 2014-08-29 21:45:57

+0

我不認爲它有可能,但有人可能知道我不會 – IainDunning 2014-08-30 01:47:13

+0

出於好奇,爲什麼你想知道如何做到這一點? – IainDunning 2014-08-30 01:48:19

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