Как добавить файл в автозагрузку Python

Обновлено: 02.07.2024

Если вы выйдете из интерпретатора Python и войдете в него снова, сделанные вами определения (функции и переменные) будут потеряны. Поэтому, если вы хотите написать несколько более длинную программу, вам лучше использовать текстовый редактор, чтобы подготовить ввод для интерпретатора и вместо этого запустить его с этим файлом в качестве ввода. Это называется созданием скрипта. По мере того, как ваша программа становится длиннее, вы можете разделить ее на несколько файлов для облегчения обслуживания. Вы также можете использовать удобную функцию, написанную вами в нескольких программах, не копируя ее определение в каждую программу.

Для этого в Python есть способ поместить определения в файл и использовать их в сценарии или в интерактивном экземпляре интерпретатора. Такой файл называется модулем; определения из модуля можно импортировать в другие модули или в главный модуль (набор переменных, к которым у вас есть доступ в скрипте, выполняемом на верхнем уровне, и в калькуляторе). режим).

Модуль — это файл, содержащий определения и операторы Python. Имя файла — это имя модуля с добавленным суффиксом .py. Внутри модуля имя модуля (в виде строки) доступно как значение глобальной переменной __name__. Например, с помощью вашего любимого текстового редактора создайте файл fibo.py в текущем каталоге со следующим содержимым:

Теперь войдите в интерпретатор Python и импортируйте этот модуль с помощью следующей команды:

Это не вводит имена функций, определенных в fibo, непосредственно в текущую таблицу символов; он вводит туда только имя модуля fibo. Используя имя модуля, вы можете получить доступ к функциям:

Если вы собираетесь часто использовать функцию, вы можете присвоить ей локальное имя:

6.1. Подробнее о модулях¶

Модуль может содержать исполняемые операторы, а также определения функций. Эти операторы предназначены для инициализации модуля. Они выполняются только в первый раз, когда имя модуля встречается в операторе импорта. 1 (Они также запускаются, если файл выполняется как скрипт.)

Каждый модуль имеет свою собственную таблицу символов, которая используется в качестве глобальной таблицы символов всеми функциями, определенными в модуле. Таким образом, автор модуля может использовать глобальные переменные в модуле, не беспокоясь о случайных столкновениях с глобальными переменными пользователя. С другой стороны, если вы знаете, что делаете, вы можете обращаться к глобальным переменным модуля с той же нотацией, которая используется для обозначения его функций, modname.itemname .

Модули могут импортировать другие модули. Обычно, но не обязательно, все операторы импорта помещаются в начало модуля (или скрипта, если уж на то пошло). Имена импортированных модулей помещаются в глобальную таблицу символов импортирующего модуля.

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

Это не вводит имя модуля, из которого берутся импорты, в локальную таблицу символов (поэтому в примере фибо не определено).

Существует даже вариант импорта всех имен, определенных модулем:

При этом импортируются все имена, кроме тех, которые начинаются с символа подчеркивания ( _ ). В большинстве случаев программисты на Python не используют эту возможность, поскольку она вводит в интерпретатор неизвестный набор имен, возможно, скрывая некоторые вещи, которые вы уже определили.

Обратите внимание, что обычно практика импорта * из модуля или пакета осуждается, так как это часто приводит к плохо читаемому коду. Однако его можно использовать для экономии ввода в интерактивных сеансах.

Если за именем модуля следует as , то имя после as напрямую связано с импортированным модулем.

Это фактически импортирует модуль так же, как это делает import fibo, с той лишь разницей, что он доступен как fib .

Его также можно использовать при использовании from с аналогичными эффектами:

Из соображений эффективности каждый модуль импортируется только один раз за сеанс интерпретатора. Поэтому, если вы меняете свои модули, вы должны перезапустить интерпретатор — или, если вы хотите протестировать только один модуль в интерактивном режиме, используйте importlib.reload() , например импортировать импортную библиотеку; importlib.reload(имя модуля) .

6.1.1. Выполнение модулей как скриптов¶

Когда вы запускаете модуль Python с

код в модуле будет выполнен так же, как если бы вы его импортировали, но с __name__, установленным на "__main__" . Это означает, что, добавив этот код в конец вашего модуля:

вы можете сделать файл пригодным для использования как скрипт, а также как импортируемый модуль, потому что код, анализирующий командную строку, запускается только в том случае, если модуль выполняется как «основной» файл:

Если модуль импортирован, код не запускается:

Это часто используется либо для предоставления удобного пользовательского интерфейса модулю, либо для целей тестирования (запуск модуля как сценария выполняет набор тестов).

6.1.2.Путь поиска модуля¶

Когда импортируется модуль с именем spam, интерпретатор сначала ищет встроенный модуль с таким именем. Если он не найден, он ищет файл с именем spam.py в списке каталогов, заданном переменной sys.path. sys.path инициализируется из следующих мест:

Каталог, содержащий входной скрипт (или текущий каталог, если файл не указан).

PYTHONPATH (список имен каталогов с тем же синтаксисом, что и переменная оболочки PATH ).

Зависимое от установки значение по умолчанию (по соглашению включает каталог site-packages, обрабатываемый модулем site).

В файловых системах, поддерживающих символические ссылки, каталог, содержащий входной скрипт, вычисляется после перехода по символической ссылке. Другими словами, каталог, содержащий символическую ссылку, не добавляется в путь поиска модуля.

После инициализации программы Python могут изменять sys.path . Каталог, содержащий выполняемый скрипт, помещается в начало пути поиска перед стандартным путем библиотеки. Это означает, что скрипты в этом каталоге будут загружены вместо одноименных модулей в каталоге библиотеки. Это ошибка, если замена не предназначена. Дополнительную информацию см. в разделе Стандартные модули.

6.1.3. «Скомпилированные» файлы Python¶

Чтобы ускорить загрузку модулей, Python кэширует скомпилированную версию каждого модуля в каталоге __pycache__ под именем module. версия .pyc , где версия кодирует формат скомпилированного файла; обычно он содержит номер версии Python. Например, в выпуске CPython 3.3 скомпилированная версия spam.py будет кэшироваться как __pycache__/spam.cpython-33.pyc. Это соглашение об именах позволяет сосуществовать скомпилированным модулям из разных выпусков и разных версий Python.

Python сравнивает дату модификации исходного кода с скомпилированной версией, чтобы определить, не устарела ли она и не нуждается ли она в повторной компиляции. Это полностью автоматический процесс. Кроме того, скомпилированные модули не зависят от платформы, поэтому одну и ту же библиотеку можно использовать в системах с разной архитектурой.

Python не проверяет кэш в двух случаях. Во-первых, он всегда перекомпилирует и не сохраняет результат для модуля, загруженного непосредственно из командной строки. Во-вторых, он не проверяет кэш, если нет исходного модуля. Для поддержки не исходного (только скомпилированного) дистрибутива скомпилированный модуль должен находиться в исходном каталоге, и не должно быть исходного модуля.

Несколько советов для экспертов:

Вы можете использовать ключи -O или -OO в команде Python, чтобы уменьшить размер скомпилированного модуля. Переключатель -O удаляет утверждения утверждений, переключатель -OO удаляет как утверждения утверждений, так и строки __doc__. Поскольку некоторые программы могут полагаться на их доступность, вам следует использовать эту опцию только в том случае, если вы знаете, что делаете. «Оптимизированные» модули имеют тег opt-tag и обычно меньше по размеру. В будущих версиях результаты оптимизации могут быть изменены.

При чтении из файла .pyc программа работает не быстрее, чем при чтении из файла .py; единственное, что быстрее в файлах .pyc, — это скорость их загрузки.

Модуль compileall может создавать файлы .pyc для всех модулей в каталоге.

Подробнее об этом процессе, включая блок-схему решений, см. в PEP 3147.

6.2. Стандартные модули¶

Python поставляется с библиотекой стандартных модулей, описанных в отдельном документе — Справочнике по библиотеке Python (далее — «Справочник по библиотеке»). Некоторые модули встроены в интерпретатор; они обеспечивают доступ к операциям, которые не являются частью ядра языка, но, тем не менее, встроены либо для повышения эффективности, либо для предоставления доступа к примитивам операционной системы, таким как системные вызовы. Набор таких модулей является опцией конфигурации, которая также зависит от базовой платформы. Например, модуль winreg предоставляется только в системах Windows. Отдельного внимания заслуживает один конкретный модуль: sys, встроенный в каждый интерпретатор Python. Переменные sys.ps1 и sys.ps2 определяют строки, используемые в качестве основных и дополнительных подсказок:

Эти две переменные определяются только в том случае, если интерпретатор находится в интерактивном режиме.

Переменная sys.path представляет собой список строк, определяющих путь поиска модулей интерпретатором. Он инициализируется путем по умолчанию, взятым из переменной среды PYTHONPATH или из встроенного значения по умолчанию, если PYTHONPATH не задан. Вы можете изменить его, используя стандартные операции со списками:

6.3. Функция dir()¶

Встроенная функция dir() используется для определения имен, определяемых модулем. Он возвращает отсортированный список строк:

Без аргументов dir() перечисляет имена, которые вы определили в данный момент:

Обратите внимание, что в нем перечислены все типы имен: переменные, модули, функции и т. д.

dir() не перечисляет имена встроенных функций и переменных.Если вам нужен их список, они определены в стандартных встроенных модулях:

6.4. Пакеты¶

Пакеты — это способ структурирования пространства имен модулей Python с помощью «точечных имен модулей». Например, имя модуля A.B обозначает подмодуль с именем B в пакете с именем A. Точно так же, как использование модулей избавляет авторов разных модулей от необходимости беспокоиться об именах глобальных переменных друг друга, использование имен модулей с точками избавляет авторов многомодульных пакетов, таких как NumPy или Pillow, от необходимости беспокоиться об именах модулей друг друга. .

Предположим, вы хотите разработать набор модулей («пакет») для единообразной обработки звуковых файлов и звуковых данных. Существует множество различных форматов звуковых файлов (обычно распознаваемых по их расширениям, например: .wav, .aiff, .au), поэтому вам может потребоваться создать и поддерживать растущую коллекцию модулей для преобразования между различными форматами файлов. Существует также множество различных операций, которые вы, возможно, захотите выполнить со звуковыми данными (например, микширование, добавление эха, применение функции эквалайзера, создание искусственного стереоэффекта), так что, кроме того, вы будете писать нескончаемый поток модулей для выполнения. эти операции. Вот возможная структура вашего пакета (выраженная в терминах иерархической файловой системы):

При импорте пакета Python просматривает каталоги sys.path в поисках подкаталога пакета.

Файлы __init__.py необходимы для того, чтобы Python рассматривал каталоги, содержащие файл, как пакеты. Это предотвращает непреднамеренное сокрытие допустимых модулей каталогами с общим именем, таким как string , которые встречаются позже в пути поиска модулей. В простейшем случае __init__.py может быть просто пустым файлом, но он также может выполнять код инициализации пакета или устанавливать переменную __all__, описанную ниже.

Пользователи пакета могут импортировать отдельные модули из пакета, например:

Это загружает подмодуль sound.effects.echo. На него должно указываться его полное имя.

Альтернативный способ импорта подмодуля:

Это также загружает подмодуль echo и делает его доступным без префикса пакета, поэтому его можно использовать следующим образом:

Еще один вариант — импортировать нужную функцию или переменную напрямую:

Опять же, это загружает подмодуль echo , но делает его функцию echofilter() доступной напрямую:

Обратите внимание, что при использовании элемента импорта из пакета элемент может быть либо подмодулем (или подпакетом) пакета, либо каким-либо другим именем, определенным в пакете, например, функцией, классом или переменной. Оператор импорта сначала проверяет, определен ли элемент в пакете; если нет, он предполагает, что это модуль, и пытается загрузить его. Если его не удается найти, возникает исключение ImportError.

Наоборот, при использовании синтаксиса наподобие import item.subitem.subsubitem каждый элемент, кроме последнего, должен быть пакетом; последний элемент может быть модулем или пакетом, но не может быть классом, функцией или переменной, определенной в предыдущем элементе.

6.4.1. Импорт * из пакета¶

Что происходит, когда пользователь пишет из sound.effects import * ? В идеале можно было бы надеяться, что это каким-то образом выйдет в файловую систему, найдет, какие подмодули присутствуют в пакете, и импортирует их все. Это может занять много времени, а импорт подмодулей может привести к нежелательным побочным эффектам, которые должны иметь место только при явном импорте подмодуля.

Единственным решением для автора пакета является предоставление явного индекса пакета. В операторе импорта используется следующее соглашение: если код пакета __init__.py определяет список с именем __all__ , он считается списком имен модулей, которые следует импортировать, когда встречается from package import *. Автор пакета должен поддерживать этот список в актуальном состоянии при выпуске новой версии пакета. Авторы пакетов также могут принять решение не поддерживать его, если они не видят смысла в импорте * из своего пакета. Например, файл sound/effects/__init__.py может содержать следующий код:

Это будет означать, что из sound.effects import * будут импортированы три именованных подмодуля звукового пакета.

Если __all__ не определено, инструкция из sound.effects import * не импортирует все подмодули из пакета sound.effects в текущее пространство имен; это только гарантирует, что пакет sound.effects был импортирован (возможно, запуск любого кода инициализации в __init__.py ), а затем импортирует любые имена, определенные в пакете. Сюда входят любые имена, определенные (и явно загруженные подмодули) с помощью __init__.py. Он также включает любые подмодули пакета, которые были явно загружены предыдущими операторами импорта. Рассмотрим этот код:

В этом примере модули эха и объемного звучания импортируются в текущее пространство имен, так как они определены в пакете sound.effects, когда файл from. выполняется оператор импорта.(Это также работает, когда определено __all__.)

Несмотря на то, что некоторые модули предназначены для экспорта только тех имен, которые соответствуют определенным шаблонам при использовании import * , это по-прежнему считается плохой практикой в ​​производственном коде.

Помните, что нет ничего плохого в использовании from package importspecific_submodule ! На самом деле это рекомендуемая нотация, если импортирующему модулю не нужно использовать подмодули с одинаковыми именами из разных пакетов.

6.4.2. Внутрипакетные ссылки¶

Когда пакеты структурированы в подпакеты (как в случае со звуковым пакетом в примере), вы можете использовать абсолютный импорт для ссылки на подмодули одноуровневых пакетов. Например, если модулю sound.filters.vocoder необходимо использовать модуль echo в пакете sound.effects, он может использовать from sound.effects import echo .

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

Обратите внимание, что относительный импорт основан на имени текущего модуля. Поскольку имя основного модуля всегда "__main__" , модули, предназначенные для использования в качестве основного модуля приложения Python, всегда должны использовать абсолютный импорт.

6.4.3. Пакеты в нескольких каталогах¶

Пакеты поддерживают еще один специальный атрибут — __path__ . Он инициализируется как список, содержащий имя каталога, содержащего __init__.py пакета, до выполнения кода в этом файле. Эту переменную можно изменить; это повлияет на дальнейший поиск модулей и подпакетов, содержащихся в пакете.

Хотя эта функция требуется нечасто, ее можно использовать для расширения набора модулей в пакете.

Фактически определения функций также являются «операторами», которые «выполняются»; выполнение определения функции на уровне модуля вводит имя функции в глобальную таблицу символов модуля.

Как я могу автоматически загружать все свои модули, хранящиеся в разных каталогах и подкаталогах?

Я видел этот ответ, в котором используется __import__ , но я все еще не имею в виду автозагрузку.

Я думаю, что-то похожее на автозагрузчик PHP. Еще лучше что-то вроде автозагрузчика Composer.

Похоже, что автозагрузчик не очень популярен в Python, судя по исследованиям, которые я собрал до сих пор (не могу быть уверен, так как я новичок в Python). Является ли автозагрузка чем-то неприемлемым в Python?

Мой код автозагрузки на данный момент

Как видите, мне все еще нужны эти строки для загрузки модулей,

Что делать, если у меня куча папок и подпапок? Я собираюсь перечислить их все? В конце концов, список будет длинным, не так ли?

Кроме того, использование __import__ не имеет большого значения,

Последний вариант мне кажется более красивым и аккуратным.

это нормально. Может быть, мне стоит поискать, как превратить эти модули в пакет? У меня уже есть __init__.py в каждой папке.

вы можете попытаться импортировать модули только тогда, когда они нужны (например, внутри функции). может быть не лучшим путем.

2 ответа 2

TL;DR: забудьте об этом и используйте явный импорт.

Python — это не PHP — ни с технической точки зрения, ни с дизайнерской/философской.

Части философии Python (также известной как "Python's Zen") таковы: "Явное лучше, чем неявное", "Удобочитаемость имеет значение" и "Перед лицом двусмысленности откажитесь от искушения угадать", что делает "функцию" похожей на «Автозагрузка» PHP очень непитоновская, так как 1. она менее явная, чем «импортировать мой модуль» или «из моего модуля импортировать SomeName», 2. она также менее читабельна (вы не знаете точно, откуда импортируется имя), и 3. когда два или более модуля определяют одно и то же имя (что вполне допустимо и довольно часто встречается в Python), ему придется попытаться угадать, какое из них вам нужно (что было бы технически невозможно).

С технической точки зрения невозможно надежно реализовать такую ​​функцию в Python — см. пункт 3 выше. Хотя оператор require в PHP и оператор import в Python могут выглядеть одинаково, на самом деле они работают совершенно по-разному, и «модели выполнения» также совершенно разные.

Написание моего первого модуля на Python было запутанным опытом. Как это обычно бывает, когда я тестировал его в интерактивном Python REPL, в первой версии оказались баги (во второй и третьей тоже были 😉).

Хорошо — подумал я. Я просто исправлю модуль и повторно импортирую его.

Но, к моему удивлению, вызов из my_module import my_function не обновил код! В my_function все еще была ошибка, которую я только что исправил! Я перепроверил, изменил ли я правильный файл, снова импортировал его, и все равно ничего. Оказывается, как любезно объяснил StackOverflow, нельзя просто повторно импортировать модуль.Если вы уже импортировали модуль ( import a_module ) или функцию ( from a_module import a_function ) в сеанс Python и пытаетесь импортировать их снова, ничего не произойдет. Неважно, используете ли вы стандартный Python REPL или IPython.

Как работает импорт в Python?

Оказывается, из соображений эффективности, когда вы импортируете модуль в интерактивном сеансе Python, интерпретатор Python выполняет два шага:

  1. Сначала проверяется, не кэширован ли уже модуль в словаре sys.module.
  2. И только если его там нет, он фактически импортирует модуль.

Это означает, что если вы уже импортировали модуль (или импортировали другой модуль, который ссылается на этот) и пытаетесь импортировать его снова, Python проигнорирует этот запрос. Подробнее о том, как работает импорт, можно прочитать в документации.

Итак, если я не могу повторно импортировать модуль, значит ли это, что мне нужно каждый раз перезапускать Python? Не совсем, это было бы очень неудобно.

Как повторно импортировать модуль?

Самый простой способ — выйти из интерактивного сеанса и начать его заново. Это прекрасно работает, если вы не заботитесь о сохранении данных, которые уже есть в вашем сеансе, таких как написанные вами функции и вычисленные вами переменные. Но обычно вы не хотите перезапускать REPL, поэтому есть способы получше.

Поскольку мы знаем, что интерпретатор сначала будет искать модуль в словаре sys.modules, мы можем просто удалить наш модуль из этого словаря. И это будет работать в большинстве случаев, но есть некоторые предостережения. Если на ваш модуль есть ссылка из другого модуля, есть вероятность, что вы все равно не сможете его повторно импортировать. Так что не делайте этого. Есть лучший способ.

Рекомендуемым решением является использование функции importlib.reload. Эта функция предназначена именно для реимпорта модулей, которые уже были импортированы ранее. Чтобы перезагрузить модуль, вам нужно запустить:

Вот как вы можете повторно импортировать модуль в Python. И если вы не используете IPython, на этом ваши варианты заканчиваются. Но у пользователей IPython есть и другие интересные решения этой проблемы.

Если вам не нужно на самом деле «импортировать» ваш модуль, и все, что вам нужно, это запустить некоторые функции, определенные в файле, вы можете вместо этого выполнить этот файл. Он будет запускать все команды, как если бы вы копировали и вставляли их в сеанс IPython. Вы можете повторно запускать файл столько раз, сколько захотите, и он всегда будет обновлять все функции. Запустить файл в IPython очень просто:

Я немного схитрил, когда сказал, что эта опция недоступна в стандартном Python REPL. Это так, но для этого нужно больше печатать:

Честно говоря, если бы мне пришлось набирать все это, я мог бы просто использовать вместо этого importlib.reload.

Все эти варианты хороши, но если у вас так же плохо, как у меня, когда дело доходит до написания кода, и вы делаете много ошибок, то это означает много перезагрузки. И набрав это importlib.reload/%run/exec. раздражает. Было бы здорово, если бы был способ автоматически перезагружать модуль? Что ж, IPython действительно может это сделать!

%autoreload спешит на помощь

Еще один магический метод IPython связан с перезагрузкой модулей. Это называется %autoreload. По умолчанию он не включен, поэтому вам нужно загрузить его как расширение:

Теперь вы можете включить автоперезагрузку:

Каждый раз, когда вы выполняете какой-либо код, IPython повторно импортирует все модули, чтобы убедиться, что вы используете самые последние возможные версии.

Вы можете установить 3 параметра конфигурации:

  • %autoreload 0 — отключает автоперезагрузку. Это настройка по умолчанию.
  • %autoreload 1 — будут автоматически перезагружаться только те модули, которые были импортированы с помощью функции %aimport (например, %aimport my_module ). Это хороший вариант, если вы хотите автоматически перезагружать только выбранный модуль.
  • %autoreload 2 - автоматически перезагрузить все модули. Отличный способ значительно упростить написание и тестирование модулей.

Отлично, есть замечания? Я нашел 3 второстепенных:

  • IPython с включенной функцией %autoreload будет немного медленнее. IPython довольно умен в отношении того, что перезагружать. Он проверит временные метки модификации модулей и сравнит их со временем, когда они были импортированы. Но эта проверка (и, в конечном итоге, повторный импорт измененных модулей) все равно займет некоторое время. Он не будет настолько медленным, чтобы вы могли это почувствовать (если только у вас нет модулей, импорт которых занимает несколько секунд), но, очевидно, он будет работать быстрее, если вы отключите автоматическую перезагрузку.
  • Как указано в документации, функция %autoreload не надежна на 100%, и ее поведение может быть непредвиденным. Я никогда не замечал никаких проблем, но некоторые пользователи Reddit отметили, что это может работать некорректно для более продвинутых модулей (с классами и т. д.).
  • Вы должны убедиться, что у вас нет синтаксических ошибок в ваших модулях, когда вы запускаете команды IPython.Я часто начинаю писать какой-то код в файл и в середине команды переключаюсь на IPython, чтобы быстро что-то протестировать. И когда я выполняю какой-то код в IPython, он попытается повторно импортировать файл, который я только что изменил (тот, что с наполовину написанной командой), и выдаст SyntaxError. Хорошо то, что после ошибки вы все равно получите вывод команды, которую вы выполнили. Так что для меня это мелкая неприятность, а не реальная проблема. Вы можете легко решить эту проблему, запустив два сеанса IPython: один для тестирования модуля (с включенным %autoreload), а другой для запуска некоторых случайных команд и поиска информации в документации.

Поэтому, если вы еще не знакомы с %autoreload, попробуйте в следующий раз, когда будете работать над модулем на Python!

Моя фотография

Привет, я Себастьян. Я пишу и рассказываю о Python: как писать лучший код, какие классные инструменты и библиотеки я использую, какие советы и рекомендации облегчают мне жизнь.

Посмотрите мою последнюю серию статей под названием «Написание более быстрого Python», в которой я сравниваю различные структуры кода и даю незапрошенные советы о том, когда их использовать. А если вам нравятся приложения для MacOS и инструменты CLI (а кому нет?), посмотрите мои любимые приложения для Mac и инструменты CLI.

Когда я не веду блог, я помогаю компаниям максимально эффективно использовать Python — либо на своих семинарах, либо в качестве консультанта/фрилансера.

Let

Как 5-минутный взлом функции %reload превратился в кроличью нору различных инструментов и методов Python.

25 советов по IPython для Ваше следующее пришествие кода

Я не всегда принимаю участие в соревнованиях Advent of Code. Но когда я это делаю, я делаю это в IPython. Позвольте мне показать вам, почему.

Руководство по расширениям IPython

Что такое расширения IPython, как их установить и как написать и опубликовать собственное расширение?

Когда вы ссылаетесь на класс, который не был импортирован, PyCharm помогает найти этот файл и добавить его в список импортируемых. Вы можете импортировать один класс или весь пакет, в зависимости от ваших настроек.

Инструкция импорта добавляется в раздел импорта, но курсор не перемещается с текущей позиции, а текущий сеанс редактирования не приостанавливается. Эта функция известна как Помощник по импорту. Использование Ассистента импорта — предпочтительный способ обработки импорта в PyCharm, поскольку оптимизация импорта не поддерживается через командную строку.

Та же возможность применима и к файлам XML. Когда вы вводите тег с несвязанным пространством имен, помощник по импорту предлагает создать пространство имен и предлагает список подходящих вариантов.

Автоматически добавлять операторы импорта

Вы можете настроить IDE для автоматического добавления операторов импорта, если нет вариантов для выбора.

В диалоговом окне «Настройки/Настройки» ( Ctrl+Alt+S ) щелкните Редактор | Общие | Автоматический импорт.

В разделе Python настройте автоматический импорт:

Выберите Показать всплывающее окно импорта, чтобы автоматически отображать всплывающее окно импорта при связывании имени класса, в котором отсутствует оператор импорта.

Выберите один из параметров предпочтительного стиля импорта, чтобы определить способ создания оператора импорта.

Отключить автоматический импорт

Если вы хотите полностью отключить автоматический импорт, убедитесь, что:

Все подсказки импорта отключены.

Оптимизировать импорт

Функция «Оптимизировать импорт» помогает удалить неиспользуемые операции импорта и упорядочить операторы импорта в текущем файле или во всех файлах в каталоге одновременно в соответствии с правилами, указанными в разделе «Настройки/Предпочтения | Редактор | стиль кода | | Импорт .

Вы можете исключить определенные файлы и папки из оптимизации импорта. Дополнительные сведения см. в разделе Исключение файлов из переформатирования.

Оптимизировать весь импорт

Выберите файл или каталог в окне инструментов проекта ( Вид | Окна инструментов | Проект ).

Выполните одно из следующих действий:

В главном меню выберите Код | Оптимизируйте импорт (или нажмите Ctrl+Alt+O ).

В контекстном меню выберите "Оптимизировать импорт" .

(Если вы выбрали каталог) Выберите, хотите ли вы оптимизировать импорт всех файлов в каталоге или только локально измененных файлов (если ваш проект находится под контролем версий), и нажмите «Выполнить».

Оптимизировать импорт в одном файле

Поместите курсор в оператор импорта и нажмите Alt+Enter или используйте значок.

Выберите Оптимизировать импорт .

Чтобы оптимизировать импорт в файле, вы также можете нажать Ctrl+Alt+Shift+L , выбрать Оптимизировать импорт и нажать Выполнить.

Оптимизировать импорт при фиксации изменений в Git

Если ваш проект находится под контролем версий, вы можете указать PyCharm оптимизировать импорт в измененных файлах перед их фиксацией в системе контроля версий.

Нажмите Ctrl+K или выберите Git | Подтвердить из главного меню.

Нажмите и в области Перед фиксацией установите флажок Оптимизировать импорт.

Автоматически оптимизировать импорт при сохранении

Вы можете настроить IDE для автоматической оптимизации импорта в измененных файлах при сохранении ваших изменений.

Нажмите Ctrl+Alt+S, чтобы открыть настройки IDE, и выберите Инструменты | Действия при сохранении .

Включите параметр "Оптимизировать импорт".

Кроме того, из списка Все типы файлов выберите типы файлов, для которых вы хотите оптимизировать импорт.

Примените изменения и закройте диалоговое окно.

Создание импорта на лету

Импорт пакетов на лету

Начните вводить имя в редакторе. Если имя ссылается на класс, который не был импортирован, появится следующее приглашение:

всплывающее окно импорта

Неразрешенные ссылки будут подчеркнуты, и вам придется явно вызвать действие намерения Добавить импорт.

Нажмите клавиши ALT+ВВОД . Если есть несколько вариантов, выберите нужный импорт из списка.

Вы можете определить предпочтительный стиль импорта для кода Python, используя следующие параметры, доступные на странице "Автоматический импорт" в настройках проекта (Настройки/Настройки | Редактор | Общие | Автоимпорт):

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

быстрое исправление проверки импорта

Переключение между относительным и абсолютным импортом

PyCharm помогает организовать относительный и абсолютный импорт в корневом каталоге источника. С особым намерением вы можете преобразовать абсолютный импорт в относительный и относительный импорт в абсолютный.

Если ваш код содержит какой-либо оператор относительного импорта, PyCharm добавит относительный импорт при исправлении отсутствующего импорта.

Обратите внимание, что относительный импорт работает только в пределах текущего исходного корня: вы не можете относительно импортировать пакет из другого исходного корня.

Намерения, предлагающие вам преобразовать импорт, включены по умолчанию. Чтобы отключить их, откройте Настройки/Настройки проекта ( Ctrl+Alt+S ), выберите Редактор | Намерения и снимите флажки Преобразовать абсолютный импорт в относительный и Преобразовать относительный импорт в абсолютный .

Намерения по преобразованию импорта

Когда вы заполняете символ ES6 или модуль CommonJS, PyCharm либо сам определяет стиль оператора импорта, либо отображает всплывающее окно, в котором вы можете выбрать нужный стиль. Подробнее об автоматическом импорте в JavaScript.

Добавление операторов импорта при завершении кода

PyCharm автоматически добавляет оператор импорта, когда вы ссылаетесь на любой элемент модуля или пакет в коде Python и вызываете автодополнение кода. Автоматический импорт при завершении кода также применяется к некоторым популярным псевдонимам имен пакетов, таким как np для numpy или pd для pandas.

PyCharm также добавляет операторы импорта при заполнении экспортированных символов JavaScript или TypeScript.

Настроить автоматический импорт по завершении

Вы можете отключить автоматический импорт по завершении и вместо этого использовать быстрые исправления:

В диалоговом окне «Настройки/Настройки» ( Ctrl+Alt+S ) выберите «Редактор | Общие | Автоматический импорт.

На открывшейся странице автоматического импорта установите флажки в области TypeScript/JavaScript, чтобы включить или отключить генерацию импорта при завершении кода.

Игнорирование отсутствующих операторов импорта

Автозагрузчик Databricks — Рекомендуемое изображение

Компании по всему миру записывают данные из множества источников, таких как реляционные базы данных, приложения SaaS, плоские файлы, такие как CSV и т. д. В настоящее время наблюдается постепенный переход от традиционных локальных хранилищ к облачным платформам в различных организаций по всему миру. Облачные решения, такие как хранилища данных, предоставляют структурированное, масштабируемое центральное хранилище, тогда как озера данных обеспечивают хранение всех форматов данных, включая неструктурированные данные, с лучшей доступностью и простотой использования.

Включая лучшее из этих двух решений, Data Lakehouse, такой как Databricks, обеспечивает молниеносную платформу обработки и преобразования данных со встроенными инструментами для SQL Analytics, отчетов бизнес-аналитики, обработки данных и машинного обучения. Для более эффективного приема данных в таблицы Databricks Delta Lake можно использовать автозагрузчик Databricks. Когда новые файлы попадают в ваше облачное хранилище, такое как Azure Data Lake Storage, Amazon S3 или Google Cloud Storage, автозагрузчик Databricks начинает их автоматически обрабатывать.

В этой статье вы узнаете, как эффективно использовать автозагрузчик Databricks для упрощения процесса приема данных.

Содержание

Что такое блоки данных?

Автозагрузчик Databricks — логотип Databricks

Источник изображения

Databricks – это гибкий механизм Cloud Data Lakehousing Engine, который позволяет подготавливать и обрабатывать данные, обучать модели и управлять всем жизненным циклом машинного обучения, от тестирования до производства. Построенный на основе Apache Spark, быстрого и универсального механизма для крупномасштабной обработки данных, Databricks обеспечивает надежную и первоклассную производительность. Помимо простоты использования, он также поддерживает такие языки программирования, как Python, R, Java и SQL. В дополнение к вашим озерам данных Databricks предоставляет Delta Lake, уровень хранилища открытого формата, который помогает в транзакциях ACID, масштабируемой обработке метаданных и объединяет потоковую и пакетную обработку данных.

Databricks также интегрирован с основными поставщиками облачных услуг, такими как Amazon Web Services, Microsoft Azure и Google Cloud Platform. Это позволяет вам начать использовать Databricks поверх желаемой платформы облачного хранилища, предоставляя вам больший контроль над вашими данными, поскольку они остаются в вашей облачной учетной записи и источниках данных. Выступая в качестве унифицированного решения для всех ваших групп по науке о данных, машинному обучению и корпоративным командам, оно предлагает такие функции, как MFlow для полного управления жизненным циклом машинного обучения, отчетность BI в Delta Lake для бизнес-аналитики в реальном времени и рабочую область Databricks, которая способствует совместной работе на рабочем месте. где несколько команд могут взаимодействовать и работать одновременно.

Что такое автозагрузчик Databricks?

Автозагрузчик Databricks — схема взаимосвязей автозагрузчика

Источник изображения

Автозагрузчик Databricks — это оптимизированный источник файлов, который может автоматически выполнять добавочную загрузку данных из вашего облачного хранилища по мере их поступления в таблицы Delta Lake. Databricks Autoloader представляет новый источник структурированной потоковой передачи под названием cloudFiles. С путями файловой системы Databricks (DBFS) или прямыми путями к источнику данных в качестве входных данных он автоматически настраивает уведомления о файлах, которые подписываются на события файлов, для обработки новых файлов по прибытии с возможностью обработки существующих в каталоге.< /p>

Автозагрузчик Databricks поддерживает два метода обнаружения новых файлов в облачном хранилище, а именно:

Основные функции автозагрузчика Databricks

Автозагрузчик Databricks — преимущества автозагрузчика

Источник изображения

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

  • Масштабируемость: Databricks Autoloader может отслеживать миллиарды файлов с помощью облачных сервисов и RockDB без необходимости перечисления всех файлов в вашем каталоге.
  • Экономичность: режим уведомлений для обнаружения файлов устраняет необходимость в списке каталогов, тем самым снижая затраты. Стоимость обнаружения файлов также напрямую зависит от количества загружаемых файлов, а не от количества каталогов, в которые они поступают.
  • Простота использования. Автозагрузчик Databricks настраивает режим уведомлений и службы очереди сообщений для выполнения добавочной загрузки данных. Вам также не нужно отслеживать файлы или управлять информацией о том, какие файлы были доставлены.
  • Вывод схемы и эволюция. В случаях, когда есть дрейфы схемы, такие как новые столбцы, автозагрузчик Databricks будет управлять этим и уведомлять вас об изменении схемы. Используя API доступа к полуструктурированным данным, вы также можете восстановить данные (непредвиденные данные в столбце, такие как разные типы данных), которые в противном случае могут быть потеряны или проигнорированы.

Упростите ETL и анализ Databricks с помощью конвейера данных Hevo без кода

Hevo Data — это конвейер данных без кода, который предлагает полностью управляемое решение для настройки интеграции данных из более чем 100 источников данных (включая более 40 бесплатных источников данных) и позволяет напрямую загружать данные в блоки данных или хранилище данных. /Направление по вашему выбору. Он автоматизирует поток данных за считанные минуты без написания кода. Его отказоустойчивая архитектура гарантирует безопасность и согласованность ваших данных. Hevo предоставляет вам действительно эффективное и полностью автоматизированное решение для управления данными в режиме реального времени и всегда имеет готовые к анализу данные.

Его полностью автоматизированный конвейер данных обеспечивает доставку данных в режиме реального времени без каких-либо потерь от источника к месту назначения. Его отказоустойчивая и масштабируемая архитектура гарантирует, что данные обрабатываются безопасным, согласованным образом с нулевой потерей данных и поддерживает различные формы данных. Предоставленные решения совместимы и работают с различными инструментами бизнес-аналитики.

Ознакомьтесь с некоторыми интересными функциями Hevo:

Предпосылки

  • Активная учетная запись Databricks.
  • Рабочее знание Python.

Как использовать автозагрузчик Databricks: 3 основных способа

Автозагрузчик Databricks обеспечивает простой способ загрузки необработанных данных с малой задержкой и меньшими усилиями по кодированию со стороны вашей инженерной группы. Фундаментальный код на Python для запуска потока автозагрузчика для записи данных в Delta Lake в режиме списка каталогов:

  • cloudFiles-option: параметр конфигурации автозагрузчика.
  • Схема: схема данных файла, который вы предоставляете.
  • Входной путь и выходной путь: входной путь к хранилищу, куда поступают новые файлы, и путь выходного потока соответственно.
  • checkpointLocation: местоположение контрольной точки трансляции.
  • Триггер: необязательный параметр для запуска трансляции.

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

A) Запланированные пакетные и потоковые загрузки с помощью автозагрузчика Databricks

Автозагрузчик Databricks — пакетная и потоковая загрузка в озеро Дельта с помощью автозагрузчика< бр />

Источник изображения

Для потоковых заданий вы можете начать использовать функции автозагрузчика Databricks с помощью следующего кода:

В этом примере, аналогично определению источника потоковой передачи, автозагрузчик Databricks создает облачные файлы, которые ожидают файлы JSON с входным путем каталога, который постоянно отслеживается для новых файлов.

Например, если данные поступают с регулярными интервалами, например каждые несколько часов, вы можете использовать автозагрузчик для создания запланированного задания и снизить эксплуатационные расходы для кластеров с помощью режима Trigger.Once структурированной потоковой передачи.

B) Настройте автозагрузчик Databricks

Общие для обоих методов обнаружения файлов, то есть списка каталогов и режима уведомления о файлах, вы можете настроить автозагрузчик Databricks, используя следующий параметр:

  • cloudFiles.allowOverwrites: при значении по умолчанию, установленном как true, решает, разрешать ли изменения файла входного каталога перезаписывать существующие данные.
  • cloudFiles.format: указывает данные, поступающие из исходного пути. Например, требуется .json для файлов JSON, .csv для файлов CSV и т. д.
  • cloudFiles.includeExistingFiles: если по умолчанию установлено значение true, это проверяет, следует ли включать существующие файлы во входной путь потоковой обработки или обрабатывать только новые файлы, поступающие после первоначальной настройки.
  • cloudFiles.inferColumnTypes: с начальным значением, заданным как false, проверяется, следует ли выводить точные типы столбцов при использовании вывода схемы.
  • cloudFiles.maxBytesPerTrigger: устанавливает максимальное количество байтов, которое автозагрузчик будет обрабатывать при каждом триггере.
  • cloudFiles.maxFileAge: используется для установки продолжительности отслеживания события в целях дедупликации. Это обычно используется при быстром приеме миллионов файлов в час.
  • cloudFiles.resourceTags: пары "ключ-значение", помогающие определить нужные ресурсы.
  • cloudFiles.schemaEvolutionMode: задает различные режимы эволюции схемы, т. е. когда в данных обнаруживаются новые столбцы.
  • cloudFiles.schemaHints: это информация о схеме ваших данных, предоставленная вами автозагрузчику.
  • cloudFiles.schemaLocation. Описывает место для хранения предполагаемой схемы вместе со связанными изменениями.
  • cloudFiles.validateOptions: проверяет, имеют ли параметры автозагрузчика, о которых говорилось выше, допустимое значение или нет.
  • cloudFiles.backfillInterval: 100%-ная доставка загруженного файла не гарантируется в режиме уведомления о файлах. Вы можете использовать Backfills, чтобы обеспечить обработку всех файлов.Этот параметр определяет интервал запуска обратной засыпки.

C) Получение данных в формате CSV, JSON или изображения с помощью автозагрузчика блоков данных

Загрузчик данных обеспечивает эффективный прием данных для различных форматов файлов, таких как файлы JSON, CSV, PARQUET, AVRO, TEXT, BINARYFILE и ORC.

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

В приведенном выше примере используется CSV для параметра конфигурации cloudFiles.Format. Вы можете установить его в json для загрузки файлов JSON.

Чтобы записать данные изображения в оптимизированном формате в таблицу Delta Lake, используйте приведенный ниже код:

Все вышеперечисленные коды написаны на Python, вы также можете выполнять вышеуказанные операции на Scala.

Заключение

В этой статье вы изучили основы эффективного использования Databricks Autoloader для загрузки данных из облачного хранилища с повышенной производительностью, масштабируемостью, экономичностью и простотой использования. Это сокращает время и усилия, которые ваши команды DevOps должны затрачивать вручную на перечисление файлов, настройку облачных уведомлений и т. д. В соответствии с вариантами использования в вашем бизнесе вы можете настроить параметры автозагрузчика и в конечном итоге сократить расходы. Автозагрузчик поддерживает прием данных для нескольких форматов файлов и может автоматически обнаруживать изменения в данных, например добавление новых столбцов.

Помимо данных в облачном хранилище, бизнес-данные также хранятся в различных приложениях, используемых для маркетинга, управления взаимоотношениями с клиентами, бухгалтерского учета, продаж, управления персоналом и т. д. Сбор данных из всех этих приложений имеет первостепенное значение, поскольку они предоставляют четкое и глубокое понимание эффективности вашего бизнеса. Эффективная обработка этого огромного объема данных может быть чрезвычайно сложной задачей, поскольку вам необходимо создать интеграцию со всеми существующими платформами, а также со всеми новыми, которые могут появиться в будущем. Вашей группе инженеров также потребуется постоянно обновлять соединители по мере их развития с каждым новым выпуском. Все это можно легко автоматизировать с помощью облачного инструмента ETL, такого как Hevo Data.

Hevo Data — это конвейер данных без кода, который помогает вам беспрепятственно передавать данные из обширного набора источников в озеро данных, такое как блоки данных, хранилище данных или место назначения по вашему выбору, для визуализации в инструменте BI. Это безопасный, надежный и полностью автоматизированный сервис, не требующий написания кода!

Если вы используете Databricks в качестве платформы Data Lakehouse и Analytics в своем бизнесе и ищете удобную альтернативу ручной интеграции данных, Hevo может эффективно автоматизировать это для вас. Hevo с его тесной интеграцией с более чем 100 источниками данных и инструментами бизнес-аналитики (включая более 40 бесплатных источников) позволяет вам не только экспортировать и загружать данные, но также преобразовывать и обогащать ваши данные и делать их готовыми к анализу.

Хотите упростить процесс интеграции данных с помощью Hevo? Подпишитесь на 14-дневную бесплатную пробную версию и испытайте многофункциональный пакет Hevo из первых рук. Ознакомьтесь с информацией о ценах, чтобы лучше понять, какой план подходит вам больше всего.

Поделитесь с нами своим опытом использования автозагрузчика Databricks. Дайте нам знать в разделе комментариев ниже!

Читайте также: