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)
我是 运行 在 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)