Документация Engee

Работа с пакетами Julia

Введение

Пакеты Julia — это организованный набор готовых функций, классов и объектов для решения различных задач. Пакеты Julia можно установить с помощью менеджера пакетов Pkg и использовать в своих проектах. При необходимости более четкого разделения пакетов на пользовательские и системные — используйте EngeePkg.

В Engee работа с пакетами Julia также осуществляется через встроенный менеджер пакетов Pkg с помощью двух инструментов рабочего пространства — командную строку img 41 1 2 и редактор скриптов img41 1.

При работе с большим количеством пакетов удобно использовать редактор скриптов, в котором после вызова Pkg не требуется его повторная инициализация. Командная строка удобна в том случае, если вам привычнее работать с кодом вне интерфейса редактора скриптов и с небольшим количеством пакетов.

Подробное описание работы с менеджером пакетов Pkg можно найти здесь.

Принцип работы с пакетами

  1. Найдите точное название интересующего вас пакета. Экосистема Julia содержит более десяти тысяч пакетов, зарегистрированных в общем реестре, что может сильно затруднить поиск нужного пакета. Для оптимизации поиска рекомендуем обратиться к следующим источникам:

    • Программирование — раздел Engee с полной документацией по Julia на русском языке.

    • JuliaHub — сервис для поиска по всей зарегистрированной документации пакетов с открытым исходным кодом с возможностью сортировки по тегам и ключевым словам.

    • Julia Packages — онлайн-ресурс, предназначенный для поиска, изучения и просмотра пакетов Julia с возможностью настройки фильтров по категориям, популярности и датам.

    • Julia.jl — главный репозиторий пакетов для языка программирования Julia. Этот репозиторий хранится на платформе GitHub и содержит множество полезных пакетов и инструментов, разработанных сообществом для работы с языком Julia.

  2. Выберите инструмент для работы с пакетами — командная строка или редактор скриптов в зависимости от ваших задач.

  3. Инициализируйте работу с пакетами в Julia, добавив менеджер пакетов Pkg. Синтаксис добавления менеджера отличается в зависимости от выбранного инструмента.

  4. Добавьте пакеты с помощью команды add в ваше окружение, чтобы использовать их в своем проекте. Синтаксис добавления пакетов зависит от выбранного инструмента.

  5. Загрузите пакет в пространство имен и получите доступ к его конкретным элементам с помощью операторов using и import. Вы также можете добавить и собственные пакеты.

  6. При необходимости узнайте статус пакета через 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")

После нажатия кнопки Пуск img 1 1 2 на этой секции будет импортирован менеджер пакетов 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 чувствительны к регистру и должны начинаться с заглавной буквы, в противном случае вы получите сообщение об ошибке.

Статус пакетов

Чтобы узнать, какие пакеты установлены и готовы к использованию, откройте командную строку и выполните следующие действия:

  1. Войдите в менеджер пакетов Pkg через ].

  2. Пропишите команду 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

Символы и означают, что для пакетов есть новые версии:

  • — имеется более новая версия.

  • — имеется более новая версия, но есть конфликты по совместимости с другими пакетами.

Узнать, какие пакеты установлены и готовы к использованию, можно и через редактор скриптов:

  1. Введите import Pkg, если не сделали этого ранее.

  2. Введите 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 автоматически отслеживать и управлять зависимостями, что делает их более надежными и удобными для повторного использования и распространения.

Создание модуля

Если цель — создать код и переиспользовать его в дальнейшем, то можно ограничиться собственным модулем. Для этого в файловом браузере file browser 7 создайте файл будущего модуля с желаемым именем и в желаемой директории, например файл 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 в текущей сессии. Для этого нажмите кнопку Обратная связь kernel reboot 1 в рабочем пространстве Engee и выберите kernel reboot Перезапуск ядра, или используйте команду:

engee.clear_all()

Для распространения пакетов нужно загрузить файлы пакетов в общий репозиторий, в качестве которого могут выступать различные хостинги, например git.engee.com. Подробнее о работе с удаленным репозиторием и выгрузкой локальных файлов читайте в нашем цикле статей по Git, системе контроля версий применяемой в Engee. Пакеты Julia также можно зарегистрировать в основном реестре пакетов Julia — General Registry. Для этого используйте инструмент Registrator.jl.

Пакеты можно установить с помощью URL репозитория, например для GitHub:

using Pkg
Pkg.add("https://github.com/username/repositoryname")

Если пакет будет успешно зарегистрирован через Registrator.jl, то он может быть установлена стандартной командой:

using Pkg
Pkg.add("LibraryName")

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

expirienced users 1

Операторы 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 libs 1

Следовательно, Julia может загружать и использовать пакеты, необходимые для проекта, используя пути, указанные в элементах массивов пути LOAD_PATH[1] и LOAD_PATH[2]. Тогда использование using и import:

  • using — используйте using если необходимо загрузить модуль и сделать все его экспортированные символы доступными в текущем пространстве имен. using загружает модуль в память и добавляет его в список загруженных модулей (loaded_modules), что означает, что его функции и переменные становятся доступными напрямую в коде. Это удобно, когда вам нужно часто использовать функции или переменные из модуля без необходимости повторного указания его имени.

  • import — используйте import если необходимо загрузить модуль, но нет нужны в импорте всех его символов в текущее пространство имен. import не загружает модуль в память и не добавляет его в loaded_modules, но создает ссылку, позволяя использовать символы через квалифицированные имена. Используйте import, если нужны только определенные символы из модуля или нужно явно указать их происхождение, чтобы избежать конфликтов имен.

Таким образом, основное различие заключается в том, что using загружает и импортирует все экспортированные символы модуля, в то время как import создает ссылку на модуль, позволяя выбирать, какие символы использовать.