Lyn*_*ite 10
一旦你加载了它,你就拥有了一个Module对象。
如果你有模块对象,你可以使用pathof它来查找它。
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"\nRun Code Online (Sandbox Code Playgroud)\n如果我们范围更广一点,想要一个不是包的模块的路径,但要么直接加载,要么是子模块,那么pathof就行不通。
例如LibPQ.jl有一个Errors子模块
\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\nRun Code Online (Sandbox Code Playgroud)\n输出是nothing.
这是根据pathof文档
\n\n\n
m.jl返回用于导入 module 的文件的路径m,如果m不是从包导入的,则不返回任何内容。
如果你想追踪它,有一个技巧。\njulia 中的所有模块(除了baremodules)都会自动包含自己eval函数的定义。\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\nRun Code Online (Sandbox Code Playgroud)\n除了baremodules不是包的模块之外,还有一种他们不同意的情况。
pathof通过清单解析模块位置。\n如果在加载模块后更改清单,\n则加载的模块实际上仍然引用旧位置,但引用清单,因此pathof会认为它位于新位置。
(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"\nRun Code Online (Sandbox Code Playgroud)\npathof给出了可以说是错误的答案(对于 julia 1.5 来说是这样,至少我怀疑它将来可能会改变。)\n但是,module_file因为它查看实际加载的代码并在加载时记录该位置,所以给出了正确的答案回答。
| 归档时间: |
|
| 查看次数: |
7491 次 |
| 最近记录: |