JuliaBox - LoadError: unlink: read-only file system (EROFS) Failed to precompile .julia/lib/v0.4/PyCall.ji

JuliaBox - LoadError: unlink: read-only file system (EROFS) Failed to precompile .julia/lib/v0.4/PyCall.ji

我是 运行 在 Juliabox (IJulia Notebook) but it's errors out with an error mesg as listed below. I not sure if it's trying to use my machine's disk to write to but I have valid R+W access there. Basically I'm trying out the examples as mentioned here: https://www.juliabox.org/notebooks/tutorial/Plotting%20in%20Julia.ipynb#

中使用 PyPlot 的小 Julia 程序

LoadError: unlink: 只读文件系统 (EROFS)

Pkg.add("PyPlot")
using PyPlot

for i = 1.0:300.0
    for j = 1.0+i:250.0, k=1.0:10
        plot(i+j, i*k/j, color="red", linewidth=1.0, linestyle="--")
        i += 0.1
        j += 0.05
        k += 0.01
    end
end

错误日志:

INFO: Nothing to be done
INFO: Precompiling module PyPlot...
INFO: Recompiling stale cache file /opt/julia_packages/.julia/lib/v0.4/Compat.ji for module Compat.
ERROR: LoadError: unlink: read-only file system (EROFS)
 in unlink at fs.jl:102
 in rm at file.jl:59
 in create_expr_cache at loading.jl:330
 in recompile_stale at loading.jl:461
 in _require_from_serialized at loading.jl:83
 in _require_from_serialized at ./loading.jl:109
 in require at ./loading.jl:219
 in include at ./boot.jl:261
 in include_from_node1 at ./loading.jl:304
 [inlined code] from none:2
 in anonymous at no file:0
 in process_options at ./client.jl:257
 in _start at ./client.jl:378
while loading /home/juser/.julia/v0.4/PyCall/src/PyCall.jl, in expression starting on line 26
ERROR: LoadError: Failed to precompile PyCall to /home/juser/.julia/lib/v0.4/PyCall.ji
 in error at ./error.jl:21
 in compilecache at loading.jl:384
 in require at ./loading.jl:224
 in include at ./boot.jl:261
 in include_from_node1 at ./loading.jl:304
 [inlined code] from none:2
 in anonymous at no file:0
 in process_options at ./client.jl:257
 in _start at ./client.jl:378
while loading /home/juser/.julia/v0.4/PyPlot/src/PyPlot.jl, in expression starting on line 5

LoadError: Failed to precompile PyPlot to /home/juser/.julia/lib/v0.4/PyPlot.ji
while loading In[10], in expression starting on line 2

 in error at ./error.jl:21
 in compilecache at loading.jl:384
 in require at ./loading.jl:250

如果我使用 0.3.12 版本 (IJulia Notebook),那么它会编译并显示 INFO: Nothing to be done 但不会显示任何输出(一些图形绘图等)。

感谢ali_m。这是 post 所说内容的主要摘要。

问题似乎是 JuliaBox 在 read-only 目录 /opt/julia_packages/.julia/lib/v0.4 中提供了一些预编译的缓存文件。如果在某个时候它检测到缓存已过时并尝试重新编译它,则会失败。

这需要在 Julia 本身中修复——它不应该在重新编译时尝试从 read-only 目录中删除缓存文件。

问题 link 是 https://github.com/JuliaLang/julia/issues/14368

要仅在 0.4.2 中解决它,可以使用(这将从 Base.LOAD_CACHE_PATH array/set/tuple 中删除第 3 个索引值)到 JuliaBox 上的 .juliarc 文件以删除 read-only 从搜索路径缓存目录。或者在不使用 read-only 搜索路径的情况下使用 Compat 等在键入之前手动 运行 重建缓存。

splice!(Base.LOAD_CACHE_PATH, 3)

splice! 函数的一个很好的例子 (PS:Julia 中以 ! 结尾的函数及其名称意味着,该函数不仅会执行其工作,还会更改其参数 data/value) .

# Remove elements from an array by index with splice!
arr = [3,4,5]
splice!(arr,2) # => 4 ; arr is now [3,5]

建议的解决方法适用于 0.4.2(使用 echo 'splice!(Base.LOAD_CACHE_PATH, 3)' > ~/.juliarc.jl 将行插入 juliarc)但显然 LOAD_CACHE_PATH 在启动 Julia 0.3.12 时未定义,因此这会在那里失败。

在同一个文件中添加以下行 修复这个问题(添加一个条件以在 Julia 中的版本为 0.4 或更高时工作).我在 0.5 开发版本中没有看到这个问题,所以我们在那里很好。

VERSION >= v"0.4" && splice!(Base.LOAD_CACHE_PATH, 3)