首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >包括Julia中的文件:@everywhere包括

包括Julia中的文件:@everywhere包括
EN

Stack Overflow用户
提问于 2018-03-20 11:51:13
回答 1查看 1.8K关注 0票数 3

我正在尝试在另一个Julia文件中包含一个带有函数的文件。我可以用

代码语言:javascript
复制
include("ImpurityChainLibrary.jl")

但是,当我这样做的时候

代码语言:javascript
复制
@everywhere include("ImpurityChainLibrary.jl")

我得到一个错误(缩写):

代码语言:javascript
复制
ERROR: On worker 3: SystemError: opening file /Users/alex/Documents/Julia/Graphene_Adsorbant_Lattice/ImpurityChainLibrary.jl: No such file or directory ...

我在跑步

代码语言:javascript
复制
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")行时,我得到了上面描述的错误。

我做错了什么?

谢谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-06-05 06:23:45

我认为这个问题被驳回得太快了。该行为可以在Atom环境之外重现。(我在OSX上使用Julia 0.6.3 )

假设您有一个存储库结构:

代码语言:javascript
复制
repo/
   src/
       -MyMod.jl
       -script.jl

其中“MyMod.jl”包含:

代码语言:javascript
复制
module MyMod
    export f
    f(x) = 5 * x
end

和“script.jl”,其中包含:

代码语言:javascript
复制
@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对主进程的相对路径的解释与从属进程的相对路径不同。在主要的“相对”似乎是相对于脚本/文件,在工人上它是相对于当前的工作目录。

作为一种解决办法,我一直在使用(**编辑以处理预编译):

代码语言:javascript
复制
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

我希望这能帮到你。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49376061

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档