我想通过修改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
在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
结果表明我们已经在其中加载了文件test.jl
和module(Test
),但实际上未加载using/import
模块。这是受人尊敬的行为,因为我们使用了错误的模块名称,这也是julia在警告中抱怨的原因。在这种情况下,using test
等效于include("test.jl")
,但是我强烈建议您遵循约定并且不要使用此行为。
require
在此PR之后,BTW 通常变得区分大小写。副作用是您LOAD_PATH
还应该区分大小写,此公关将在julia-0.6中解决此问题。