使Julia在加载路径中查找文件
我想通过修改使Julia在加载路径中查找文件,julia,Julia,我想通过修改LOAD\u PATH变量来帮助Julia找到我的.jl文件: julia> readdir() 1-element Array{String,1}: "test.jl" shell> cmd /c type test.jl # Test.jl module Test export f f() = println("hi") end julia> push!(LOAD_PATH,pwd()); julia> import Test ERROR: Arg
LOAD\u PATH
变量来帮助Julia找到我的.jl文件:
julia> readdir()
1-element Array{String,1}:
"test.jl"
shell> cmd /c type test.jl
# Test.jl
module Test
export f
f() = println("hi")
end
julia> push!(LOAD_PATH,pwd());
julia> import Test
ERROR: ArgumentError: Module Test not found in current path.
Run `Pkg.add("Test")` to install the Test package.
in require(::Symbol) at .\loading.jl:365
第一次调用readdir()
证明我在当前目录中有一个名为test.jl的文件。下面的shell调用显示该文件包含一个名为Test的模块。下一次调用push!(加载路径,pwd())
将当前目录放入加载路径
。但即使当前目录位于LOAD\u PATH
,Julia仍然无法在Test.jl中找到Test
模块
怎么了?错误是关于
要求的内容。正如医生所说:
给定使用Foo
的语句,系统在Main
中查找Foo
。如果模块不存在,系统会尝试要求(“Foo”)
,这通常会导致从已安装的软件包加载代码require
在所有平台上都区分大小写,包括macOS和Windows等文件系统不区分大小写的平台
原因很清楚:require
在LOAD\u PATH
中找不到名为Test
的文件。因此,我们需要使文件名与模块名匹配,但这只是一种约定,不是强制性规则。如果有人错误地使用test运行,会发生什么
julia> push!(LOAD_PATH,pwd())
julia> using test
WARNING: requiring "test" in module "Main" did not define a corresponding module.
julia> whos()
Base 34427 KB Module
Core 12386 KB Module
Main 41296 KB Module
Test 1837 bytes Module
结果表明,我们已经加载了文件test.jl
和其中的模块(test
),但实际上没有使用/import
模块加载。这是一个值得尊敬的行为,因为我们使用了错误的模块名称,这也是julia在警告中抱怨的原因。在这种情况下,使用test
相当于include(“test.jl”)
,但我强烈建议您遵循惯例,不要使用此行为
顺便说一句,require
在之后通常区分大小写。一个副作用是你的加载路径也应该区分大小写,这将在julia-0.6中修复。@gnimu链接页面建议首先使用包含。但是,除非我的工作目录包含某个文件,否则无法成功包含该文件,即使该文件的目录位于LOAD_路径中。如果这真的是解决方案,那么加载路径有什么好处呢?LOAD\u PATH
用于加载库/项目代码,一个常见的用例是将您的日常工作路径推入.juliarc.jl,并在每次启动REPL时自动加载<代码>包含
用于从REPL以交互方式加载代码。请注意,使用LOAD\u PATH
时,文件名应与模块名完全相同(区分大小写),错误来自此处。但是使用include
,您可以使用任何您喜欢的文件名。为了澄清,如果您的模块名为“Test”,则文件名必须为“Test.jl”,而不是“Test.jl”。@gnimu您关于模块名与文件名匹配的观点正是我想要的(链接页面中没有包含该信息)。如果你把它作为一个答案发布,我会接受的。@JeffreySarnoff严格地说,这不是一个强制性的规则,只是一个惯例,但实际上是OP用例中的解决方案;)。