我想通过修改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
模块。
出了什么问题?
答案 0 :(得分:4)
错误在于谈论有关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
结果显示我们已将文件test.jl
和模块(Test
)加载到其中,但实际上并非using/import
模块。这是一个受人尊敬的行为,因为我们使用了错误的模块名称,这也是julia在警告中抱怨的原因。在这种情况下,using test
相当于include("test.jl")
,但我强烈建议您遵循约定,不要使用此行为。
BTW,require
在this PR之后变得普遍区分大小写。副作用是LOAD_PATH
也应区分大小写,这将由this PR在julia-0.6中修复。