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

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