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