让Julia在LOAD_PATH中查找文件

时间:2017-01-14 01:37:29

标签: 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

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

出了什么问题?

1 个答案:

答案 0 :(得分:4)

错误在于谈论有关require的事情。正如医生所说:

  

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

原因很明显:requireTest中找不到名为LOAD_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

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

BTW,requirethis PR之后变得普遍区分大小写。副作用是LOAD_PATH也应区分大小写,这将由this PR在julia-0.6中修复。