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

log*_*ick 7 julia

我试图在 Julia 中找到特定包的路径。我不知道它到底在哪里,我想使用适当的路径。Julia 中有执行此操作的函数吗?

Lyn*_*ite 10

一旦你加载了它,你就拥有了一个Module对象。

\n

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

\n
julia> using DataFrames\n\njulia> pathof(DataFrames)\n"/Users/oxinabox/.julia/packages/DataFrames/cdZCk/src/DataFrames.jl"\n\njulia> pathof(DataFrames.PooledArrays)\n"/Users/oxinabox/.julia/packages/PooledArrays/yiLq3/src/PooledArrays.jl"\n
Run Code Online (Sandbox Code Playgroud)\n

如果我们范围更广一点,想要一个不是包的模块的路径,但要么直接加载,要么是子模块,那么pathof就行不通。

\n

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

\n
\njulia> using LibPQ\n\njulia> pathof(LibPQ)\n"/Users/oxinabox/.julia/packages/LibPQ/SFs6f/src/LibPQ.jl"\n\njulia> typeof(LibPQ.Errors)\nModule\n\njulia> pathof(LibPQ.Errors)\n\n
Run Code Online (Sandbox Code Playgroud)\n

输出是nothing.

\n

这是根据pathof文档

\n
\n

m.jl返回用于导入 module 的文件的路径m,如果m不是从包导入的,则不返回任何内容。

\n
\n

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

\n
julia> module_file(modu) = String(first(methods(getfield(modu, :eval))).file)\nmodule_file (generic function with 1 method)\n\njulia> module_file(LibPQ)\n"/Users/oxinabox/.julia/packages/LibPQ/SFs6f/src/LibPQ.jl"\n\njulia> module_file(LibPQ.Errors)\n"/Users/oxinabox/.julia/packages/LibPQ/SFs6f/src/exceptions.jl\n
Run Code Online (Sandbox Code Playgroud)\n

除了baremodules不是包的模块之外,还有一种他们不同意的情况。

\n

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

\n
(11) pkg> dev --local LibPQ\n    Cloning git-repo `https://github.com/invenia/LibPQ.jl.git`\n  Resolving package versions...\nUpdating `~/temp/11/Project.toml`\n  [194296ae] ~ LibPQ v1.5.0 \xe2\x87\x92 v1.5.0 `dev/LibPQ`\nUpdating `~/temp/11/Manifest.toml`\n  [194296ae] ~ LibPQ v1.5.0 \xe2\x87\x92 v1.5.0 `dev/LibPQ`\n   Building LibPQ \xe2\x86\x92 `~/temp/11/dev/LibPQ/deps/build.log`\n\njulia> pathof(LibPQ)\n"/Users/oxinabox/temp/11/dev/LibPQ/src/LibPQ.jl"\n\njulia> module_file(LibPQ)\n"/Users/oxinabox/.julia/packages/LibPQ/SFs6f/src/LibPQ.jl"\n
Run Code Online (Sandbox Code Playgroud)\n

pathof给出了可以说是错误的答案(对于 julia 1.5 来说是这样,至少我怀疑它将来可能会改变。)\n但是,module_file因为它查看实际加载的代码并在加载时记录该位置,所以给出了正确的答案回答。

\n