Как использовать собственные модули в блокноте JuliaBox?

Я недавно начал использовать JuliaBox для программирования в Julia, и я хочу использовать свои собственные модули, которые я ранее написал с помощью IDE Juno-Atom. Я загрузил соответствующие модули в JuliaBox, но не могу вызвать их из блокнота JuliaBox. Сообщение об ошибке, которое я получаю, выглядит следующим образом:

using MyModule

ArgumentError: Module MyModule not found in current path.
Run `Pkg.add("MyModule")` to install the MyModule package.

Stacktrace:
 [1] _require(::Symbol) at ./loading.jl:435
 [2] require(::Symbol) at ./loading.jl:405
 [3] include_string(::String, ::String) at ./loading.jl:522

Первоначально у меня был модуль в отдельной папке под названием «модули», но даже после его перемещения в основную папку (в то же место, что и блокнот) я все равно получаю то же сообщение об ошибке.

Я установил рабочий каталог:

pwd()
"/mnt/juliabox"

.. и это, кажется, папка, в которой сейчас хранится мой модуль. По крайней мере, это каталог, который отображается, когда я пытаюсь переместить файл модуля на главный экран JuliaBox.

Я попытался установить модуль как незарегистрированный пакет в Package Builder (я был в отчаянии!), но это тоже не сработало.

Поэтому мне интересно, нужно ли мне что-то добавить в JULIA_LOAD_PATH в переменных среды; однако это, похоже, противоречит цели использования онлайн-версии блокнотов Jupyter, которая, по-видимому, предназначена для обеспечения легкого доступа в любом месте.

В любом случае, у меня закончились идеи, поэтому, если кто-нибудь может дать мне понять, где я ошибаюсь, это будет очень признательно.


person Mark Birtwistle    schedule 03.04.2018    source источник


Ответы (2)


Если файл вашего модуля находится в основной папке, добавьте его в LOAD_PATH (по умолчанию он не добавляется). Настройте путь, если вы поместите файл в другое место.

 @everywhere push!(LOAD_PATH, homedir())
 import MyModule

or

include("MyModule.jl") # if it is already in pwd()
import MyModule

Проблема не связана с JuliaBox или IJulia. Вот как вы импортируете файл Module. Вы либо помещаете папку в LOAD_PATH, либо include файл, содержащий модуль.

https://docs.julialang.org/en/stable/manual/modules/#Relative-and-absolute-module-paths-1

Я считаю, что эта проблема на Github решает проблему, с которой вы столкнулись: https://github.com/JuliaLang/julia/issues/4600

person hckr    schedule 03.04.2018
comment
Добавление домашнего каталога и/или подкаталога модулей в LOAD_PATH решает мою проблему. Спасибо. - person Mark Birtwistle; 04.04.2018

Я попытался установить модуль как незарегистрированный пакет в Package Builder (я был в отчаянии!), но это тоже не сработало.

Я думаю, что функциональность сборщика пакетов работает правильно. Просто попробуйте создать фиктивный модуль со следующей структурой и содержимым:

~/MyModule.jl> tree 
.
├── REQUIRE
└── src
    ├── functions
    │   └── myfunc.jl
    └── MyModule.jl

2 directories, 3 files
~/MyModule.jl> cat REQUIRE 
julia 0.6
~/MyModule.jl> cat src/functions/myfunc.jl 
myfunc(x) = 2x
~/MyModule.jl> cat src/MyModule.jl 
module MyModule

export myfunc

include(joinpath("functions", "myfunc.jl"))

end

Затем git init репозиторий внутри каталога, git add и git commit все файлы, добавьте удаленный репозиторий (например, на GitHub или GitLab) с помощью git remote add и git push ваш локальный репозиторий во вновь добавленный удаленный репозиторий. Вы должны увидеть, что параметр незарегистрированного пакета работает должным образом.

Остается только позвонить

julia> using MyModule

julia> myfunc(10)
20

EDIT. Вы можете попробовать добавить https://github.com/aytekinar/MyModule.jl в качестве незарегистрированного пакета на ваш JuliaBox. В этом репозитории находится вышеупомянутый фиктивный модуль.

person Arda Aytekin    schedule 03.04.2018
comment
Мне удалось зарегистрировать ваш модуль MyModule, так что очевидно, что функциональность компоновщика пакетов JuliaBox работает. Мне нужно еще немного почитать о модулях/пакетах, я немного новичок с Джулией. Я выбрал предыдущий ответ, поскольку он более прямо отвечает на мой первоначальный вопрос, но спасибо за ваш вклад. - person Mark Birtwistle; 04.04.2018