JuliaBox - LoadError: unlink: файловая система только для чтения (EROFS) Не удалось предварительно скомпилировать .julia / lib / v0.4 / PyCall.ji

Я запускаю небольшую программу Julia с использованием PyPlot в Juliabox (IJulia Notebook), но она выдает сообщение об ошибке как указано ниже. Я не уверен, что он пытается использовать диск моей машины для записи, но у меня есть действующий доступ R + W. В основном я пробую примеры, упомянутые здесь: https://www.juliabox.org/notebooks/tutorial/Plotting%20in%20Julia.ipynb#

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, но ничего не показывает в качестве вывода (некоторые графические диаграммы и т. Д.).


person AKS    schedule 30.12.2015    source источник
comment
Возможно, связано с этой проблемой   -  person ali_m    schedule 30.12.2015


Ответы (1)


Спасибо ali_m. Вот основное резюме того, о чем говорится в этом сообщении.

Проблема, похоже, в том, что JuliaBox отправляет некоторые предварительно скомпилированные файлы кеша в каталог только для чтения /opt/julia_packages/.julia/lib/v0.4. Если в какой-то момент он обнаруживает, что кеш устарел, и пытается его перекомпилировать, он терпит неудачу.

Это должно быть исправлено в самой Julia - она ​​не должна пытаться удалить файлы кэша из каталога, доступного только для чтения, при перекомпиляции.

Ссылка на проблему: https://github.com/JuliaLang/julia/issues/14368.

Чтобы решить эту проблему только в 0.4.2, можно использовать (это удалит 3-е значение индекса из массива / набора / кортежа Base.LOAD_CACHE_PATH) в ваш файл .juliarc на JuliaBox, чтобы удалить каталог кэша только для чтения из пути поиска. Или просто запустите это вручную, прежде чем вводить с помощью Compat и т. Д., Чтобы восстановить кеш без использования пути поиска только для чтения.

splice!(Base.LOAD_CACHE_PATH, 3)

Хороший пример функции splice! (PS: функция в Julia, имя которой заканчивается на!, Означает, что эта функция не только выполнит свою работу, но и изменит свое аргументы данные / значение).

# 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)
person AKS    schedule 30.12.2015