ubuntu 在Julia中运行由一堆jl文件组成的项目

q3aa0525  于 5个月前  发布在  其他
关注(0)|答案(1)|浏览(72)

我是茱莉亚的新朋友。
我有一个 *.jl文件的集合。有些文件定义了某些模块:
模块AAA
使用BBB
出口商
函数fff(yyy)
返回zzz


其中一些使用的BBB是在我的集合中的其他文件中定义的模块。
其中一个 *.jl是certain master.jl,它的总体任务是读取一些输入数据并产生某些输出;它使用所有其他 *.jl中定义的模块。
我在我的Ubuntu 22.04工作站上用gcc编译了julia,它是ver.1.11.0。因此,我有一个文件夹$HOME/julia,其中链接到可执行文件julia -> usr/bin/julia
和文件夹$HOME/.julia,

logs
artifacts
packages
registries
config
prefs
compiled
conda
environments
scratchspaces

字符串
这是自动创建的(除了config; config是我根据stackoverflow的建议进行的实验)。
现在我被困在如何运行我的模块集合。
调用
julia AAA.jl
从命令行生成错误
错误:LoadError:ArgumentError:在当前路径中找不到程序包BBB。

  • 运行import Pkg; Pkg.add("BBB")安装BBB包

即使我事先在同一个窗口中运行了julia BBB.jl而没有任何错误,
如何将我的集合AAA.jl、BBB.jl、. master.jl组织到一个项目中,以便在不同文件中定义的所有模块都正确地包含在一起?

fgw7neuy

fgw7neuy1#

误差

ERROR: LoadError: ArgumentError: Package BBB not found in current path.

字符串
是因为Julia在运行AAA.jl或master. jl时并不知道BBB.jl。之前在同一个窗口中运行julia BBB.jl不会在两个脚本之间创建任何关系,因此不会更改任何内容。

修复1:使用包含和相对模块限定符

在每个使用不同模块的文件中,include其他模块的文件,并使用点来访问它。例如。AAA.jl将变为:

module AAA

include("BBB.jl")
using .BBB
export aaa
function fff(yyy)
  return zzz
end

end


这将BBB.jl的内容带入AAA.jl,并使BBB成为AAA的子模块,可以使用点语法using .BBB进行访问。请注意,这必须在每个使用其他模块的文件中完成,例如,如果master.jl需要使用AAADDD,则其内容应该是:

include("AAA.jl")
include("DDD.jl")

using .AAA
using .DDD


(If master.jl不直接使用BBB,那么就不需要包含,AAA.jl中的include就足够了。)

修复方法2:更改包加载路径

如果只有master.jl包含您要直接运行的代码,而其他文件只包含您从master.jl加载的模块,则更简单的解决方法是添加

push!(LOAD_PATH, @__DIR__)


在这种情况下,您不需要include s或点语法,文件中的其他内容可以保持原样。@__DIR__引用包含master.jl的目录,push!将其导入LOAD_PATH,这样Julia在遇到using BBB时就会搜索该目录,并且在其他任何地方都找不到它。

旁注

我在我的Ubuntu 22.04工作站上用gcc编译了julia;它是ver.1.11.0。
如果你是Julia的新手,你几乎肯定不想这样做。Julia 1.11版本目前仍在开发中,还不稳定-它的发布可能会在2024年年中左右!安装稳定Julia的最佳方法是使用juliaup脚本,这将允许您安装和更新当前稳定的Julia(截至2023年11月23日的版本为1.9.4)。如果出于某种原因,您确实希望从源代码编译,我建议下载https://github.com/JuliaLang/julia/archive/refs/tags/v1.9.4.zip而不是当前的master(这可能是你现在编译成v1.11二进制文件的内容)。

相关问题