如何在Julia中找到包裹的路径?

时间:2020-04-26 12:39:29

标签: julia

我正在尝试在Julia中找到特定软件包的路径。我不知道确切在哪里,我想使用适当的路径。在Julia中有执行此功能的功能吗?

3 个答案:

答案 0 :(得分:3)

您可以使用pathof查找导入的模块(如果该模块位于包装中,则为包装)的位置

julia> using Random

julia> pathof(Random)
"C:\\Julia-1.4.1\\share\\julia\\stdlib\\v1.4\\Random\\src\\Random.jl"

答案 1 :(得分:3)

一旦加载完毕,就会有一个Module对象。

如果有模块对象,则可以使用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"

如果我们要宽一些,并且想要的路径不是pathof而不是不是软件包的模块,而是直接加载或作为子模块,则无法使用。

例如 LibPQ.jl 具有一个Errors子模块


julia> using LibPQ

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

julia> typeof(LibPQ.Errors)
Module

julia> pathof(LibPQ.Errors)

输出为nothing

这是根据pathof documentation

返回用于导入模块m.jl的{​​{1}}文件的路径,如果未从软件包中导入m,则返回任何内容。

如果要跟踪该信息,则有一个技巧。 julia中的所有模块(m除外)都会自动包含其自己的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通过清单来解析模块位置。 如果您在加载模块后更改了清单, 那么加载的模块实际上仍然会引用旧位置,但是清单(因此清单pathof会认为它在新位置)。

pathof

(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" 给出的答案可能是错误的(至少对于julia 1.5而言,这是正确的,至少我怀疑它将来可能会改变。) 但是pathof因为可以查看实际加载的代码并在加载时记录该位置,所以给出了正确的答案。

答案 2 :(得分:1)

Julia的标准库(基础)提供了find_package函数,其功能如下:

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"
相关问题