Julia中使用@everywhere include引入文件报错的求助
解决Julia中@everywhere include文件找不到的问题
这个问题我之前也碰到过,核心原因是主进程和分布式worker进程的当前工作目录不一致:你在主进程里用相对路径include("ImpurityChainLibrary.jl")能成功,是因为主进程的工作目录正好是文件所在的目录,但worker进程启动时可能默认用了其他路径(比如Julia的安装目录或者系统默认目录),自然找不到你的库文件。
给你两个靠谱的解决方法,都适配Julia 0.6.2版本:
方法一:使用绝对路径加载文件
先获取库文件的绝对路径,再让所有worker加载这个绝对路径的文件,从根源避免路径问题:
# 获取当前脚本所在的目录(Julia 0.6.2用这个写法,0.7+可以用@__DIR__) script_directory = dirname(@__FILE__) # 拼接库文件的完整绝对路径 library_path = joinpath(script_directory, "ImpurityChainLibrary.jl") # 让所有worker加载这个绝对路径的文件 @everywhere include($library_path)
这里的$library_path是把主进程里的变量值传递给worker进程,确保每个worker拿到的都是正确的绝对路径。
方法二:统一所有进程的工作目录
先让所有worker切换到主进程的工作目录,再用相对路径加载文件:
# 获取主进程的当前工作目录 main_working_dir = pwd() # 让所有worker进程切换到这个目录 @everywhere cd($main_working_dir) # 现在就可以正常用相对路径include了 @everywhere include("ImpurityChainLibrary.jl")
额外提醒
Julia 0.6.2是比较旧的版本了,虽然上面的方法完全适配它,但如果后续有机会升级到1.x版本,会有更简洁的工具(比如@__DIR__直接获取脚本目录,分布式环境的路径处理也更完善)。不过就当前问题来说,上面两个方法都能快速解决你的报错。
内容的提问来源于stack exchange,提问作者IcyOtter
相关产品推荐
相关产品推荐

