如何在Julia中查找包的路径?

如何在Julia中查找包的路径?,julia,Julia,我试图在Julia中找到特定包的路径。我不知道它在哪里,我想使用适当的路径。Julia中有这样做的函数吗?Julia的标准库(Base)提供了一个查找包函数,其工作原理如下: julia> Base.find_package("Random") "/Applications/Julia-1.3.app/Contents/Resources/julia/share/julia/stdlib/v1.3/Random/src/Random.jl" julia> Base.find_pac

我试图在Julia中找到特定包的路径。我不知道它在哪里,我想使用适当的路径。Julia中有这样做的函数吗?

Julia的标准库(Base)提供了一个
查找包
函数,其工作原理如下:

julia> Base.find_package("Random")
"/Applications/Julia-1.3.app/Contents/Resources/julia/share/julia/stdlib/v1.3/Random/src/Random.jl"

julia> Base.find_package("JSON")
"/Users/logankilpatrick/.julia/packages/JSON/d89fA/src/JSON.jl"

您可以使用
pathf
查找导入模块的位置(如果模块在包中,则查找包)


一旦你加载了它,你就有了一个
模块
对象

如果您有模块对象,可以使用
pathof
查找它

julia> using DataFrames

julia> pathof(DataFrames)
"/Users/oxinabox/.julia/packages/DataFrames/cdZCk/src/DataFrames.jl"

julia> pathof(DataFrames.PooledArrays)
"/Users/oxinabox/.julia/packages/PooledArrays/yiLq3/src/PooledArrays.jl"
如果我们稍微宽泛一点,并且想要一个模块的路径不是一个包,而是直接加载的,或者是一个子模块,那么
pathf
将不起作用

例如,LibPQ.jl有一个
错误
子模块


julia> using LibPQ

julia> pathof(LibPQ)
"/Users/oxinabox/.julia/packages/LibPQ/SFs6f/src/LibPQ.jl"

julia> typeof(LibPQ.Errors)
Module

julia> pathof(LibPQ.Errors)

输出为

这是根据

返回用于导入模块
m
m.jl
文件的路径,如果未从包导入
m
,则返回任何内容

如果你想追踪这一点,有一个技巧。 julia中的所有模块(除了
baremodules
)自动包含自己的
eval
函数的定义。 我们可以从方法表中查找此函数的位置

julia> module_file(modu) = String(first(methods(getfield(modu, :eval))).file)
module_file (generic function with 1 method)

julia> module_file(LibPQ)
"/Users/oxinabox/.julia/packages/LibPQ/SFs6f/src/LibPQ.jl"

julia> module_file(LibPQ.Errors)
"/Users/oxinabox/.julia/packages/LibPQ/SFs6f/src/exceptions.jl
除了
baremodules
和非软件包的模块之外,还有一种情况他们不同意

pathf
通过清单解析模块位置。 如果在加载模块后更改manfiest, 然后加载的模块实际上仍然会引用旧位置,但是清单,因此
pathf
会认为它位于新位置

(11) pkg> dev --local LibPQ
    Cloning git-repo `https://github.com/invenia/LibPQ.jl.git`
  Resolving package versions...
Updating `~/temp/11/Project.toml`
  [194296ae] ~ LibPQ v1.5.0 ⇒ v1.5.0 `dev/LibPQ`
Updating `~/temp/11/Manifest.toml`
  [194296ae] ~ LibPQ v1.5.0 ⇒ v1.5.0 `dev/LibPQ`
   Building LibPQ → `~/temp/11/dev/LibPQ/deps/build.log`

julia> pathof(LibPQ)
"/Users/oxinabox/temp/11/dev/LibPQ/src/LibPQ.jl"

julia> module_file(LibPQ)
"/Users/oxinabox/.julia/packages/LibPQ/SFs6f/src/LibPQ.jl"
pathof
给出了可以说是错误的答案(这对julia 1.5来说是正确的,至少我怀疑它将来可能会改变。) 但是
module_file
,因为它查看实际加载的代码并在加载时记录该位置,所以给出了正确的答案

(11) pkg> dev --local LibPQ
    Cloning git-repo `https://github.com/invenia/LibPQ.jl.git`
  Resolving package versions...
Updating `~/temp/11/Project.toml`
  [194296ae] ~ LibPQ v1.5.0 ⇒ v1.5.0 `dev/LibPQ`
Updating `~/temp/11/Manifest.toml`
  [194296ae] ~ LibPQ v1.5.0 ⇒ v1.5.0 `dev/LibPQ`
   Building LibPQ → `~/temp/11/dev/LibPQ/deps/build.log`

julia> pathof(LibPQ)
"/Users/oxinabox/temp/11/dev/LibPQ/src/LibPQ.jl"

julia> module_file(LibPQ)
"/Users/oxinabox/.julia/packages/LibPQ/SFs6f/src/LibPQ.jl"