Работа с пакетами Julia
Введение
Пакеты Julia — это организованный набор готовых функций, классов и объектов для решения различных задач. Пакеты Julia можно установить с помощью менеджера пакетов Pkg и использовать в своих проектах. При необходимости более четкого разделения пакетов на пользовательские и системные — используйте EngeePkg.
В Engee работа с пакетами Julia также осуществляется через встроенный менеджер пакетов Pkg с помощью двух инструментов рабочего пространства — командную строку и редактор скриптов .
При работе с большим количеством пакетов удобно использовать редактор скриптов, в котором после вызова Pkg не требуется его повторная инициализация. Командная строка удобна в том случае, если вам привычнее работать с кодом вне интерфейса редактора скриптов и с небольшим количеством пакетов.
Подробное описание работы с менеджером пакетов Pkg можно найти здесь. |
Принцип работы с пакетами
-
Найдите точное название интересующего вас пакета. Экосистема Julia содержит более десяти тысяч пакетов, зарегистрированных в общем реестре, что может сильно затруднить поиск нужного пакета. Для оптимизации поиска рекомендуем обратиться к следующим источникам:
-
Программирование — раздел Engee с полной документацией по Julia на русском языке.
-
JuliaHub — сервис для поиска по всей зарегистрированной документации пакетов с открытым исходным кодом с возможностью сортировки по тегам и ключевым словам.
-
Julia Packages — онлайн-ресурс, предназначенный для поиска, изучения и просмотра пакетов Julia с возможностью настройки фильтров по категориям, популярности и датам.
-
Julia.jl — главный репозиторий пакетов для языка программирования Julia. Этот репозиторий хранится на платформе GitHub и содержит множество полезных пакетов и инструментов, разработанных сообществом для работы с языком Julia.
-
-
Выберите инструмент для работы с пакетами — командная строка или редактор скриптов в зависимости от ваших задач.
-
Инициализируйте работу с пакетами в Julia, добавив менеджер пакетов Pkg. Синтаксис добавления менеджера отличается в зависимости от выбранного инструмента.
-
Добавьте пакеты с помощью команды
add
в ваше окружение, чтобы использовать их в своем проекте. Синтаксис добавления пакетов зависит от выбранного инструмента. -
Загрузите пакет в пространство имен и получите доступ к его конкретным элементам с помощью операторов
using
иimport
. Вы также можете добавить и собственные пакеты. -
При необходимости узнайте статус пакета через
status
, проверьте, какие пакеты загружены в оперативную память Engee и удалите ненужные черезremove
илиrm
(синтаксис зависит от выбранного инструмента).
Подробная информация о работе с пакетами представлена ниже.
Пакеты Julia в командной строке
Чтобы установить новый пакет в командной строке Engee, кликните левой кнопкой мыши в области ввода кода и нажмите закрывающую квадратную скобку ]. Это переключит командную строку на работу с менеджером пакетов. Строка изменит свой вид с engee>
на pkg>
:
pkg>
В режиме менеджера пакетов используем команду add
для добавления пакета:
add Example
Вы можете добавить несколько пакетов одновременно, перечисляя их имена через запятую, например:
add Example, Plots, Pluto
Для удаления пакета используется команда remove
или ее сокращенная версия rm
:
remove Pluto
Вывод удаления пакета
Updating `/user/.project/Project.toml`
[c3e4b0f8] - Pluto v0.19.38
Updating `/user/.project/Manifest.toml`
[5218b696] - Configurations v0.17.6
[e2d170a0] - DataValueInterfaces v1.0.0
[21656369] - ExpressionExplorer v1.0.0
[55351af7] - ExproniconLite v0.10.5
[fb4132e2] - FuzzyCompletions v0.5.3
[ac1192a8] - HypertextLiteral v0.9.5
[82899510] - IteratorInterfaceExtensions v1.0.0
[0e77f7df] - LazilyInitializedFields v1.2.2
[6c6e2e6c] - MIMEs v0.1.4
[36869731] - Malt v1.1.1
[99f44e22] - MsgPack v1.2.0
[c3e4b0f8] - Pluto v0.19.38
[91cefc8d] - PrecompileSignatures v3.0.3
[aea7be01] - PrecompileTools v1.2.0
[2792f1a3] - RegistryInstances v0.1.0
[3783bdb8] - TableTraits v1.0.1
[bd369af6] - Tables v1.10.0
[410a4b4d] - Tricks v0.1.6
При необходимости вы можете удалить несколько пакетов за раз, перечисляя их имена через запятую:
remove Pluto, Plots, Example
Попытка удалить несуществующий пакет выдаст ошибку:
Вывод ошибки
The following package names could not be resolved:
* Имя пакета (not found in project or manifest)
Для выхода из режима менеджера пакетов pkg> кликните левой кнопкой мыши по области ввода кода и нажмите Backspace. Это вернет вас в первичный вид командной строки engee> .
|
Пакеты Julia в редакторе скриптов
Чтобы установить новый пакет в интерактивном скрипте Engee, в секции с кодом импортируйте Pkg командой import Pkg
, а затем выполните команду Pkg.add("Имя пакета")
. Например, секция с кодом для добавления пакета Example
будет выглядеть так:
import Pkg
Pkg.add("Example")
После нажатия кнопки Пуск на этой секции будет импортирован менеджер пакетов Pkg, и будет установлен пакет Example
. Информация о ходе установки пакета отобразится автоматически:
Resolving package versions...
Installed Example ─ v0.5.3
Updating `/user/start/Project.toml`
[7876af07] + Example v0.5.3
Updating `/user/start/Manifest.toml`
[7876af07] + Example v0.5.3
Как и в случае с командной строкой, вы можете добавить несколько пакетов одновременно, перечисляя их имена через запятую и добавляя квадратные скобки для создания массива строк, например:
Pkg.add(["Example", "Plots"])
Для удаления пакета используется команда rm
:
Pkg.rm("Example")
Для удаления нескольких пакетов одновременно используется перечисление имен через запятую и квадратные скобки:
Pkg.rm(["Example", "Plots"])
Команда remove
не определяется в редакторе скриптов, хотя и используется в командной строке. Попытка вызвать команду в редакторе выдаст ошибку:
`UndefVarError: `remove` not defined`
В редакторе скриптов имя менеджера пакетов Pkg и имена пакетов Julia чувствительны к регистру и должны начинаться с заглавной буквы, в противном случае вы получите сообщение об ошибке. |
Статус пакетов
Чтобы узнать, какие пакеты установлены и готовы к использованию, откройте командную строку и выполните следующие действия:
-
Войдите в менеджер пакетов Pkg через ].
-
Пропишите команду
status
:
pkg> status
После этого вы увидите список установленных пакетов и их версию:
Вывод статуса пакетов
pkg> status
Status `/user/.project/Project.toml`
⌅ [c3fe647b] AbstractAlgebra v0.27.8
⌅ [7d9f7c33] Accessors v0.1.27
⌅ [79e6a3ab] Adapt v3.5.0
⌅ [91a5bcdd] Plots v1.36.1
⌃ [c3e4b0f8] Pluto v0.19.36
Символы ⌃
и ⌅
означают, что для пакетов есть новые версии:
-
⌃
— имеется более новая версия. -
⌅
— имеется более новая версия, но есть конфликты по совместимости с другими пакетами.
Узнать, какие пакеты установлены и готовы к использованию, можно и через редактор скриптов:
-
Введите
import Pkg
, если не сделали этого ранее. -
Введите
Pkg.status()
для получения статуса пакетов.
Загрузка пакетов
В Julia для загрузки пакетов и предоставления доступа к их конкретным элементам, таким как функции, типы и переменные, используются операторы import
и using
:
-
using
— используется для загрузки всех экспортированных имен из модуля и привязки их к текущему пространству имен. Например:using Statistics x = mean([1, 2, 3, 4, 5])
-
import
— используется для выборочного импорта определенных функций или переменных из модуля. Требует указания имени модуля перед именем функции или переменной. Следовательно, функция или переменная, не импортированные явно, не будут доступны в текущей среде. Пример:import Statistics x = Statistics.mean([1, 2, 3, 4, 5])
Рассмотрим преимущества и ограничения операторов:
-
Преимущество
using
— удобство. Код становится более емким, все функции и переменные из модулей доступны в текущем пространстве имен. -
Недостаток
using
— использованиеusing
для загрузки больших модулей со множеством функций и переменных может повлиять на производительность и переполнение памяти. -
Недостаток
using
— конфликт имен.using
может вызвать конфликты имен, если несколько модулей определяют функции или переменные с одинаковым именем. -
Преимущество
import
— отсутствие конфликта имен. -
Преимущество
import
— сокращение времени компиляции, избегая необходимости компилировать ненужный код. -
Недостаток
import
— усложнение кода.
Таким образом, оператор using
больше подходит для небольших проектов с упором на удобство. Оператор import
больше подходит для крупных проектов с упором на избирательность и контролем над использованием памяти.
Повторное использование кода
При разработке программ на Julia часто возникает необходимость многократного использования одного и того же кода в разных проектах. В таких случаях удобно организовать код в виде модулей или пакетов.
Модуль — это более простой способ организации кода. Он представляет собой файл, содержащий функции, переменные и другие элементы, объединенные в одно пространство имен (подробнее см. здесь). Модули удобны для локальной разработки и повторного использования кода.
Пакет — это более комплексная структура, которая включает в себя не только код, но и метаданные, такие как описание проекта, зависимости, версии и т.д. Пакеты поддерживаются самой Julia через менеджер пакетов Pkg, что позволяет управлять зависимостями и версиями.
В отличие от пакетов, модули сами по себе не поддерживают автоматическое управление зависимостями через Pkg. Это может привести к ситуациям, когда модуль не работает должным образом, если зависимости не установлены или не соответствуют нужным версиям. Пакеты, с другой стороны, позволяют Julia автоматически отслеживать и управлять зависимостями, что делает их более надежными и удобными для повторного использования и распространения.
Создание модуля
Если цель — создать код и переиспользовать его в дальнейшем, то можно ограничиться собственным модулем. Для этого в файловом браузере создайте файл будущего модуля с желаемым именем и в желаемой директории, например файл my_module.jl
по пути /user/mymodule
.
С помощью команды module
добавьте содержимое модуля, например функцию:
module my_module
function get_value(x)
return x
end
end
В Julia имя модуля не обязательно должно совпадать с именем файла, но при подключении модуля с помощью using или import , нужно использовать именно то имя, которое указано внутри модуля.
|
Добавьте путь к модулю в путь Julia вручную или с помощью команды:
engee.addpath("/user/mymodule")
Используйте оператор using
, чтобы загрузить модуль:
using my_module
После загрузки модуля из него можно вызвать функцию (или любой другой встроенный код):
my_module.get_value(7)
7
Создание пакета
Для создания собственного пакета сперва создайте базовую структуру проекта с помощью команды generate
. Для этого переключите командную строку в режим оболочки shell
(клавиша ;) и перейдите в директорию, где хотите создать пакет. Например:
cd My_libs
# вывод
/user/My_libs
Сгенерируйте новый проект с помощью команды generate
(предварительно переключитесь на менеджер пакетов pkg>
нажав ; в командной строке):
generate My_lib # будет создан проект My_lib с файлами Project.toml и src/My_lib.jl
#вывод
Generating project Test_lib:
My_lib/Project.toml
My_lib/src/My_lib.jl
Команду generate
нужно выполнять один раз для каждого нового пакета. Эта команда создает начальную структуру проекта, включая файлы Project.toml
и src/Имя пакета.jl
. После генерации можно разрабатывать пакет, добавлять код, настраивать зависимости и т.д.
Проект в Julia — это структура, которая включает файлы конфигурации и каталоги, необходимые для организации, управления зависимостями и версий. Пакет может состоять из одного или нескольких файлов и может быть загружен в любой Julia-проект. |
Исходный код пакета будет размещен в папке src
. По умолчанию созданный файл пакета будет содержать код:
module My_lib
greet() = print("Hello World!")
end # module My_lib
Замените содержимое файла на следующий код с использованием другого имени модуля:
module My_lib
function get_value(x)
return x
end
end
Далее в режиме Pkg используйте команду develop
, чтобы добавить свой проект в текущую сессию:
develop /user/My_libs/My_lib/
#вывод
Resolving package versions...
Updating `~/.project/Project.toml`
[487ef170] + My_lib v0.1.0 `~/My_libs/My_lib`
Updating `~/.project/Manifest.toml`
[487ef170] + My_lib v0.1.0 `~/My_libs/My_lib`
здесь:
-
Сессия в Julia — это текущее рабочее окружение, управляемое менеджером пакетов (Pkg), которое определяет доступные пакеты и проекты для выполнения кода. Сессия включает в себя файлы конфигурации
Project.toml
иManifest.toml
, которые фиксируют информацию о версиях и зависимостях пакетов, позволяя Julia управлять проектом и его зависимостями. -
Project.toml
— описывает метаданные пакета, включая его имя, версию, авторов, а также зависимости от других пакетов. Это основной файл, который помогает Julia управлять пакетами и их версиями. Создается автоматически при использовании командыgenerate
. -
Manifest.toml
— фиксирует точные версии всех зависимостей (включая их подзависимости) пакета. Он создается автоматически, при установке зависимостей или при добавлении пакета через Pkg. Создается автоматически при использовании командыdevelop
для подключения к текущей сессии.
Команду develop нужно выполнять один раз для каждого пакета в текущем окружении. После этого пакет будет добавлен в окружение, и можно использовать его в своем коде. Если в будущем в пакет будут внесены изменения, то они автоматически будут доступны без необходимости повторного выполнения develop , так как эта команда создает символьную ссылку на пакет в окружении.
|
Для использования созданного пакета применяйте операторы import
или using
:
using My_lib
# или import My_lib
Создание пакета с помощью generate
обеспечивает структуру, которая облегчает управление зависимостями и версиями. Он также упрощает распространение пакетов.
При разработке модулей и пакетов может потребоваться перезапуск ядра, чтобы перезагрузить процессы Julia в текущей сессии. Для этого нажмите кнопку Обратная связь в рабочем пространстве Engee и выберите Перезапуск ядра, или используйте команду:
|
Для распространения пакетов нужно загрузить файлы пакетов в общий репозиторий, в качестве которого могут выступать различные хостинги, например git.engee.com. Подробнее о работе с удаленным репозиторием и выгрузкой локальных файлов читайте в нашем цикле статей по Git, системе контроля версий применяемой в Engee. Пакеты Julia также можно зарегистрировать в основном реестре пакетов Julia — General Registry. Для этого используйте инструмент Registrator.jl. Пакеты можно установить с помощью URL репозитория, например для GitHub:
Если пакет будет успешно зарегистрирован через Registrator.jl, то он может быть установлена стандартной командой:
|
EngeePkg
Работа с EngeePkg
Используйте пакет EngeePkg для четкого разделения пользовательских и системных пакетов и для расширенного функционала работы с ними в вашем проекте.
EngeePkg — это надстройка над менеджером пакетов Pkg, реализованная как самостоятельный пакет для лучшего контроля над загруженными модулями и пакетами.
EngeePkg обладает следующими преимуществами перед Pkg:
-
EngeePkg различает системные и пользовательские пакеты, выделяя среди системных те, что входят в системный образ. По умолчанию функция
EngeePkg.status
выдает всю информацию из LOAD_PATH. Классический Pkg с функциейPkg.status
не обладает таким функционалом и выдает информацию о пакетах только из одного проекта (по умолчанию — активного). Более того,EngeePkg.status
, в отличие отPkg.status
, может выдавать информацию о загруженных модулях. -
EngeePkg очищает весь пользовательский проект, удаляя все установленные пакеты функцией
EngeePkg.purge
без явного перечисления. Классический Pkg очищает проект функциейPkg.rm
, но требует явного перечисления всех пакетов.
Для работы с EngeePkg добавьте его в текущее окружение (проект):
Pkg.add("EngeePkg")
Импортируйте EngeePkg в рабочее пространство (командная строка или редактор скриптов):
using EngeePkg
Обратитесь к справке в командной строке (используйте знак вопроса ? для переключения в режим help?
) для вывода доступных команд EngeePkg:
ALL_MODULES CLI INIT_MODULES INSTALLED_MODULES
LOADED_MODULES PKGMODE_MANIFEST PKGMODE_PROJECT PKGSORT_BY_NAME
PKGSORT_BY_SRCPATH PKGSORT_BY_UUID PKGSORT_NONE PkgUtils
SYSTEM_MODULES Status USER_MODULES eval
include purge select_packages status
Далее рассмотрим функции EngeePkg.status
и EngeePkg.purge
на конкретных примерах.
Функция EngeePkg.status
Функция EngeePkg.status
выводит статус установленных пакетов и/или загруженных модулей. EngeePkg.status
, в отличие от Pkg.status
, может выдавать информацию о загруженных модулях, различать системные и пользовательские пакеты и определять, какие из них входят в системный образ.
Сигнатура функции EngeePkg.status
:
EngeePkg.status(modules::Union{String, UUID, Module, ModuleSelection};
mode::PackageMode, sort::PkgSortOrder, outdated::Bool, io::IO)
Опциональный первый аргумент modules
задает выборку пакетов/модулей. Это может быть имя или UUID одного конкретного пакета, либо один модуль как таковой, либо константа, задающая множество пакетов/модулей:
-
USER_MODULES
— установленные из пользовательских пакетов. -
SYSTEM_MODULES
— установленные из системных пакетов. -
INSTALLED_MODULES
— установленные во всех проектах (перечисляет пакеты из всех элементов LOAD_PATH). -
LOADED_MODULES
— загруженные в память (включая не установленные). -
INIT_MODULES
— загруженные в память из системного образа. -
ALL_MODULES
(по умолчанию) — все установленные и загруженные (перечисляет пакеты из всех элементов LOAD_PATH).
Аргумент io
задает терминал для вывода (по умолчанию
stdout
).
Аргумент sort
задает порядок перечисления:
-
PKGSORT_BY_NAME
— сортировать по именам пакетов; -
PKGSORT_BY_SRCPATH
— сортировать по расположению исходных файлов установленных пакетов; -
PKGSORT_BY_UUID
— сортировать по UUID пакетов; -
PKGSORT_NONE
(по умолчанию) — без сортировки.
Аргумент mode
задает режим выборки установленных пакетов:
-
PKGMODE_PROJECT
— по файлу проекта (Project.toml); -
PKGMODE_MANIFEST
— по файлу манифеста (Manifest.toml).
При выборке только установленных пакетов (USER_MODULES
, SYSTEM_MODULES
, INSTALLED_MODULES
) по умолчанию используется файл, содержащий данные о прямых зависимостях проекта (Project.toml). При выборке загруженных (LOADED_MODULES
, INIT_MODULES
, ALL_MODULES
), а также при выборке по имени и UUID — файл, описывающий структуру данных проекта (Manifest.toml).
Вывод использует тот же формат, что и Pkg.status
. При выборке пакетов из нескольких проектов для их различения используются значки ①, ② и т.д. Значком ▣ отмечаются загруженные пакеты. Например:
Status ① `/user/.project/Manifest.toml`
② `/usr/local/julia-1.9.3/environments/v1.9/Manifest.toml`
⌅ [39de3d68] AxisArrays v0.4.6 ② ▣
⌅ [98e50ef6] JuliaFormatter v1.0.20 ② ▣
[2aef5ad7] QueryOperators v0.9.3 ②
⌅ [48965c70] MatrixPencils v1.7.5 ② ▣
⌃ [69666777] Arrow v2.4.3 ②
[49dc2e85] Calculus v0.5.1 ② ▣
[efcefdf7] PCRE2_jll v10.42.0+0 ② ▣
⌅ [d8a4904e] MutableArithmetics v1.1.0 ② ▣
⌅ [aacddb02] JpegTurbo_jll v2.1.91+0 ② ▣
Функция Pkg.status
менеджера пакетов Pkg может выдавать информацию о пакетах только из одного проекта (по умолчанию — активного). Например:
Status `/user/.project/Project.toml`
[e36ba207] EngeePkg v0.0.7
[4d00f742] GeometryTypes v0.8.5
⌅ [23fbe1c1] Latexify v0.15.18
К функции EngeePkg.status
примыкает EngeePkg.select_packages
. Если status
печатает информацию в человеко-читаемом виде, то select_packages
возвращает ту же информацию в виде объекта данных, с которым можно работать программно.
Сигнатура функции select_packages
:
EngeePkg.select_packages(modules::Union{String, UUID, Module, ModuleSelection},
mode::PackageMode)
Функция select_packages
получает выборку установленных пакетов и/или загруженных модулей в виде массива описаний пакетов. Аргументы modules
и mode
имеют тот же смысл, что в EngeePkg.status
.
Функция EngeePkg.purge
Функция purge
удаляет все пакеты, установленные в заданном окружении (по умолчанию — в пользовательском проекте):
EngeePkg.purge()
Вывод исполнения команды
Updating `/user/.project/Project.toml` #удаление пакетов из Project.toml (пользовательские)
[c3fe647b] - AbstractAlgebra v0.27.8
[7d9f7c33] - Accessors v0.1.27
[79e6a3ab] - Adapt v3.5.0
[e36ba207] - EngeePkg v0.0.7
[cd3eb016] - HTTP v1.5.4
...
[91a5bcdd] - Plots v1.36.1
[c3e4b0f8] - Pluto v0.19.40
[438e738f] - PyCall v1.94.1
[d330b81b] - PyPlot v2.11.2
[3646fa90] - ScikitLearn v0.7.0
[6a2ea274] - Torch v0.1.0
Updating `/user/.project/Manifest.toml` ##удаление пакетов из Manifest.toml (системные)
[c3fe647b] - AbstractAlgebra v0.27.8
[7d9f7c33] - Accessors v0.1.27
[79e6a3ab] - Adapt v3.5.0
[b99e7846] - BinaryProvider v0.5.10
[d1d4a3ce] - BitFlags v0.1.7
...
[d360d2e6] - ChainRulesCore v1.15.7
[944b1d66] - CodecZlib v0.7.1
[19ecbf4d] - Codecs v0.5.0
[35d6a980] - ColorSchemes v3.20.0
[3da002f7] - ColorTypes v0.11.4
Функция используется для полной очистки пользовательского проекта. Менеджер пакетов Pkg не поддерживает такой функционал — доступна функция Pkg.rm
, для которой доступно только явное перечисление всех пакетов.
Среды Julia в Engee
Операторы import
и using
различаются контекстом кода и загружаемыми файлами в зависимости от текущей среды. В Julia есть два типа сред:
-
Среда проекта (project environment) — это набор файлов и настроек, определяющих окружение для разработки и выполнения конкретного проекта. Среда проекта включает в себя настройки и зависимости, которые используются в проекте. В Julia среда проекта определяется с помощью файлов Project.toml и Manifest.toml, которые содержат информацию о зависимостях и их версиях:
-
Файл проекта (Project.toml) — это файл, содержащий информацию о прямых зависимостях проекта. Он определяет имена и идентификаторы (например, имена пакетов), которые используются в проекте. Этот файл обычно содержит только прямые зависимости и их версии.
-
Файл манифеста (Manifest.toml) — это файл (если он существует), описывающий полный граф (структуру данных) зависимостей проекта. Включаются не только прямые зависимости, но и все косвенные зависимости, которые используются в проекте. Для каждой зависимости указываются точные версии (например, пакетов) и другие сведения, необходимые для обеспечения совместимости исходного кода проекта с версиями его зависимостей.
-
-
Каталог проекта (project directory) — это место, где содержатся файлы и структура вашего проекта, включая исходный код, настройки, конфигурационные файлы и наборы пакетов. Среда проекта формируется естественным образом из структуры файлов и каталогов внутри каталога проекта. В каталоге содержатся пакеты и модули, организованные в иерархию подкаталогов. Если внутри каталога пакета есть файл
имя пакета.jl
в подкаталогеsrc
— это означает, что пакетимя пакета
доступен в этом проекте, и его код загружается через этот файл.
Таким образом, среда проекта — это абстрактная среда, в которой находятся зависимости проекта, в то время как каталог проекта — это место, где физически хранятся файлы проекта. Подробнее читайте здесь.
Среда Julia определяет, какие пакеты и зависимости должны быть доступны для конкретного проекта или приложения. Затем LOAD_PATH в виде массива пути используется, чтобы указать Julia, где именно искать пакеты и модули связанные с этой средой:
-
LOAD_PATH[1] — первый элемент массива пути, задающий путь к файлам пользовательского окружения. В пользовательских Manifest.toml и Project.toml файлах указывается, какие пакеты и какие версии необходимы для данного проекта. LOAD_PATH сам по себе не изменяется ни при добавлении пакетов (Pkg.add), ни при изменении toml-файлов окружения. По умолчанию пользовательское окружение создается по пути
/user/.project
. Это позволяет Julia находить и загружать пакеты, необходимые для выполнения кода в данном проекте. -
LOAD_PATH[2] — второй элемент массива пути, задающий путь к файлам системного окружения. LOAD_PATH[2] указывает путь к системным пакетам, которые доступны для всех проектов и независимы от конкретного проекта. Путь к глобальным toml-файлам, таким как Manifest.toml и Project.toml не включается в элемент LOAD_PATH[2]. Вместо этого указывается путь к директории, содержащей эти файлы. Следовательно, пакеты, установленные системно, могут быть доступны из любого проекта, независимо от того, какие пакеты указаны в его собственных файлах проекта и манифеста. По умолчанию системное окружение создается по пути
/user/local/julia-1.M.N/environments/v1.M/
, гдеM
иN
— версия Julia в текущем проекте.
LOAD_PATH может содержать не только два элемента массива пути, но и любое количество путей к каталогам, в которых находятся пакеты. Когда Julia ищет пакет для загрузки с помощью using или import , она проверяет все пути, указанные в LOAD_PATH.
|
Помимо LOAD_PATH существует и подмножeство пакетов loaded_modules. loaded_modules (загруженные модули) относятся к списку модулей (или пакетов), которые в данный момент времени активны в текущем сеансе Julia. Каждый модуль представляет собой набор функций и данных, которые были загружены и готовы к использованию в коде.
Таким образом, Julia может загружать и использовать необходимые пакеты из всех окружений, пути к которым указаны в элементах массива LOAD_PATH. Функция Base.loaded_modules
возвращает список загруженных модулей. Для лучшего восприятия представлен рисунок ниже:
Следовательно, Julia может загружать и использовать пакеты, необходимые для проекта, используя пути, указанные в элементах массивов пути LOAD_PATH[1] и LOAD_PATH[2]. Тогда использование using
и import
:
-
using
— используйтеusing
если необходимо загрузить модуль и сделать все его экспортированные символы доступными в текущем пространстве имен.using
загружает модуль в память и добавляет его в список загруженных модулей (loaded_modules), что означает, что его функции и переменные становятся доступными напрямую в коде. Это удобно, когда вам нужно часто использовать функции или переменные из модуля без необходимости повторного указания его имени. -
import
— используйтеimport
если необходимо загрузить модуль, но нет нужны в импорте всех его символов в текущее пространство имен.import
не загружает модуль в память и не добавляет его в loaded_modules, но создает ссылку, позволяя использовать символы через квалифицированные имена. Используйтеimport
, если нужны только определенные символы из модуля или нужно явно указать их происхождение, чтобы избежать конфликтов имен.
Таким образом, основное различие заключается в том, что using
загружает и импортирует все экспортированные символы модуля, в то время как import
создает ссылку на модуль, позволяя выбирать, какие символы использовать.