我正在尝试在另一个Julia文件中包含一个带有函数的文件。我可以用
include("ImpurityChainLibrary.jl")
但是,当我这样做的时候
@everywhere include("ImpurityChainLibrary.jl")
我得到一个错误(缩写):
ERROR: On worker 3: SystemError: opening file /Users/alex/Documents/Julia/Graphene_Adsorbant_Lattice/ImpurityChainLibrary.jl: No such file or directory ...
我在跑步
Julia Version 0.6.2
Commit d386e40c17 (2017-12-13 18:08 UTC)
Platform Info:
OS: macOS (x86_64-apple-darwin14.5.0)
CPU: Intel(R) Core(TM) i7-6820HQ CPU @ 2.70GHz
WORD_SIZE: 64
BLAS: libopenblas (USE64BITINT DYNAMIC_ARCH NO_AFFINITY Haswell)
LAPACK: libopenblas64_
LIBM: libopenlibm
LLVM: libLLVM-3.9.1 (ORCJIT, skylake)
我使用Atom。
按照下面给出的最小示例,我运行了代码,它起作用了。然后,我在与dummy.jl相同的文件夹中创建了第二个文件,并将其放入一行@everywhere include("dummy.jl")
中。
然后我在Atom中启动Julia。我检查nprocs()并得到1。当我执行addprocs(3)时,函数调用通过,nprocs()显示4。当我尝试运行@everywhere include("dummy.jl")
行时,我得到了上面描述的错误。
我做错了什么?
谢谢
发布于 2018-06-05 06:23:45
我认为这个问题被驳回得太快了。该行为可以在Atom环境之外重现。(我在OSX上使用Julia 0.6.3 )
假设您有一个存储库结构:
repo/
src/
-MyMod.jl
-script.jl
其中“MyMod.jl”包含:
module MyMod
export f
f(x) = 5 * x
end
和“script.jl”,其中包含:
@everywhere include("MyMod.jl")
using MyMod
for p in workers()
@show remotecall_fetch(f, p, p)
end
在repo/src/
中,您可以成功地运行julia -p 4 script.jl
,但在repo/
中,您不能使用多个进程(即调用julia -p 4 src/script.jl
)运行Julia,因为工作进程试图加载不存在的repo/MyMod.jl
。
这似乎是因为include
对主进程的相对路径的解释与从属进程的相对路径不同。在主要的“相对”似乎是相对于脚本/文件,在工人上它是相对于当前的工作目录。
作为一种解决办法,我一直在使用(**编辑以处理预编译):
function include_everywhere(filepath)
include(filepath) # Load on Node 1 first, triggering any precompile
if nprocs() > 1
fullpath = joinpath(@__DIR__, filepath)
@sync for p in workers()
@async remotecall_wait(include, p, fullpath)
end
end
end
include_everywhere("MyMod.jl")
using MyMod
我希望这能帮到你。
https://stackoverflow.com/questions/49376061
复制相似问题