使Julia在LOAD_PATH中查找文件

Yly*_*Yly 2 julia

我想通过修改LOAD_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
Run Code Online (Sandbox Code Playgroud)

第一次调用readdir()证明我在当前目录中有一个名为test.jl的文件。以下shell调用显示此文件包含一个名为Test的模块。下一个调用push!(LOAD_PATH,pwd());会将当前目录放入LOAD_PATH。但是,即使当前目录位于中LOAD_PATH,Julia仍无法Test在test.jl中找到该模块。

怎么了?

Gni*_*muc 5

错误是在谈论一些有关require。正如文档所说:

给定使用语句Foo,系统将Foo在中查找Main。如果模块不存在,则系统尝试require("Foo"),这通常会导致从已安装的程序包中加载代码。...... require区分大小写的所有平台,包括那些喜欢的MacOS和Windows不区分大小写的文件系统。

其原因是显而易见的:require找不到指定的文件TestLOAD_PATH。因此,我们需要使文件名与模块名匹配,但这只是一个约定,不是强制性规则。如果有人错误地跑步会怎样using 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
Run Code Online (Sandbox Code Playgroud)

结果表明我们已经在其中加载了文件test.jl和module(Test),但实际上未加载using/import模块。这是受人尊敬的行为,因为我们使用了错误的模块名称,这也是julia在警告中抱怨的原因。在这种情况下,using test等效于include("test.jl"),但是我强烈建议您遵循约定并且不要使用此行为。

require此PR之后,BTW 通常变得区分大小写。副作用是您LOAD_PATH还应该区分大小写,此公关将在julia-0.6中解决此问题。