使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用例中的解决方案;)。