Работа с библиотеками Julia
Введение
Библиотеки Julia — это организованный набор готовых функций, классов и объектов для решения различных задач. Библиотеки Julia распространяются в виде пакетов, которые можно установить с помощью менеджера пакетов Pkg и использовать в своих проектах. При необходимости более четкого разделения библиотек на пользовательские и системные — используйте EngeePkg.
В Engee работа с библиотеками Julia также осуществляется через встроенной менеджер пакетов Pkg с помощью двух инструментов рабочего пространства — командную строку и редактор скриптов .
При работе с большим количеством библиотек удобно использовать редактор скриптов, в котором после вызова Pkg не требуется его повторная инициализация. Командная строка удобна в том случае, если вам привычнее работать с кодом вне интерфейса редактора скриптов и с небольшим количеством библиотек.
Подробное описание работы с менеджером пакетов Pkg можно найти здесь. |
Принцип работы с библиотеками
-
Найдите точное название интересующей вас библиотеки. Экосистема Julia содержит более десяти тысяч пакетов, зарегистрированных в общем реестре, что может сильно затруднить поиск нужного пакета. Для оптимизации поиска рекомендуем обратиться к следующим источникам:
-
Язык программирования в Engee — раздел 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
больше подходит для крупных проектов с упором на избирательность и контролем над использованием памяти.
Создание собственных библиотек
Для добавления собственных библиотек используется команда module. Чтобы создать собственную библиотеку с помощью module
в Julia, вам нужно выполнить следующее:
-
Создадим скрипт
module
и назовем его так, как бы мы хотели назвать свою библиотеку, в нашем случаеTest_lib
и добавим содержимое модуля, например функцию:module Test_lib function get_value(x) # Функция возвращения значения return x end end
-
Для загрузки своей библиотеки используем оператор
import
илиusing
(см. выше раздел загрузки библиотек):import.Test_lib # или using.Test_lib
-
Далее получим требуемый параметр через оператор
import
:import.Test_lib.get_value import_value = get_value(7) # Получим число 7
-
Или через оператор
using
:using.Test_lib using_value = get_value(7) # Получим число 7
Добавление точки между import и именем библиотеки обязательно в случае добавления собственной библиотеки из module . Аналогично и для using . Вы также можете добавить директорию с библиотекой в путь Engee, тогда ошибка не возникнет. В ином случае выведет ошибку:
|
Вывод ошибки
ArgumentError: Package Test_lib not found in current path, maybe you meant `import/using .Test_lib`.
- Otherwise, run `import Pkg; Pkg.add("Test_lib")` to install the Test_lib package.
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
создает ссылку на модуль, позволяя выбирать, какие символы использовать.