Что такое __pycache__ в Python? Как запретить создание __pycache__ и .pyc файлов?

Что такое __pycache__ в Python? Как запретить создание __pycache__ и .pyc файлов?

В этой статье будет разобрана природа возникновения папки __pycache__, которая создается при запуске кода Python.

Введение

Наверное, вы заметили, что при выполнении кода Python __pycache__ (иногда) создается каталог с именем, который содержит множество файлов с .pyc расширением.

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

Файлы .pyc и папка __pycache__

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

Обратите внимание, что пара концепций, обсуждаемых в этом разделе, касающихся интерпретатора и байт-кода, упрощены и верны лишь частично, но их более чем достаточно, чтобы помочь вам понять pyc файлы и __pycache__ директории.

Таким образом, после первого выполнения вашего исходного кода будет создана папка __pycache__, содержащая несколько .pyc файлов байт-кода с теми же именами, что и ваши .py файлы. Как уже упоминалось, они будут использоваться в последующих исполнениях, чтобы ваша программа запускалась немного быстрее.

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

Подавление/запрет создания __pycache__

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

Первый вариант — передать -B флаг при запуске файла Python. Когда флаг указан, Python не будет пытаться записывать .pyc файлы при импорте исходных модулей:

python3 -B my_python_app.py

В качестве альтернативы вы можете установить переменную среды PYTHONDONTWRITEBYTECODE в любую непустую строку. Опять же, это предотвратит попытки Python записывать .pyc файлы.

export PYTHONDONTWRITEBYTECODE=abc

Обратите внимание, что оба подхода эквивалентны.

Добавление __pycache__ в файл .gitignore

При работе в локальном репозитории Git будет отслеживать каждый файл в репозитории Git. Каждый файл может быть отслежен (т.е. уже подготовлен и зафиксирован), не отслежен (не подготовлен или зафиксирован) или проигнорирован.

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

Самый элегантный способ сделать это — через .gitignore файл, который находится в верхнем каталоге удаленного репозитория Git, в котором вы можете явно указать файлы или каталоги (также можно применять регулярные выражения), которые Git будет игнорировать и не будет отслеживать дольше.

__pycache__ входит в число каталогов, которые не следует помещать в удаленные репозитории. Поэтому все, что вам нужно сделать, это указать каталог в .gitignore файле.

# .gitignore
__pycache__/

Важное

Одно важное предостережение относительно байт-кода заключается в том, что .pyc файлы будут использоваться в тех случаях, когда эквивалентного .py файла больше нет. Например, если вы удалили или переименовали .py файл, но по какой-то причине вы все еще видите, как они выполняются любым возможным способом, то это может быть фактической причиной.

3.3 3 голоса
Рейтинг статьи
Шамаев Иван
Разработчик аналитических решений QlikView/Qlik Sense/Power BI; Python Data Scientist; Разработчик интеграционных решений на PHP, Python, JavaScript.
0
Оставьте комментарий! Напишите, что думаете по поводу статьи.x