如何在Julia中查找包的路径?
我试图在Julia中找到特定包的路径。我不知道它在哪里,我想使用适当的路径。Julia中有这样做的函数吗?Julia的标准库(Base)提供了一个如何在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> 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"