我想通过修改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中找到该模块。
怎么了?
错误是在谈论一些有关require。正如文档所说:
给定使用语句
Foo,系统将Foo在中查找Main。如果模块不存在,则系统尝试require("Foo"),这通常会导致从已安装的程序包中加载代码。......require是区分大小写的所有平台,包括那些喜欢的MacOS和Windows不区分大小写的文件系统。
其原因是显而易见的:require找不到指定的文件Test在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
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中解决此问题。