Что такое __pycache__?
Судя по всему, кеш — это зашифрованный файл, содержащий подобные файлы.
Что нам делать с папкой __pycache__
? Это то, что мы предоставляем людям вместо нашего исходного кода? Это просто мои входные данные? Эта папка продолжает создаваться, для чего она нужна?
5 ответ(ов)
Когда вы запускаете программу на Python, интерпретатор сначала компилирует ее в байт-код (это немного упрощение) и сохраняет в папке __pycache__
.
Если вы посмотрите в эту папку, то увидите много файлов, названия которых совпадают с .py
файлами в вашей папке проекта, только их расширения будут .pyc
или .pyo
. Это байт-код скомпилированной и оптимизированной версией байт-кода ваших файлов программы соответственно.
Как программист, вы можете в основном игнорировать эту папку.
Все, что она делает, это немного ускоряет запуск вашей программы. Когда ваши скрипты изменяются, они будут перескомпилированы, и если вы удалите файлы или целую папку и снова запустите программу, они появятся вновь (если вы не предприняли специальные меры для подавления этого поведения).
При отправке вашего кода другим людям общепринятой практикой является удаление этой папки, но это не столь критично. Когда вы используете систему контроля версий (git
), эта папка обычно указывается в файле игнорирования (.gitignore
) и, следовательно, не включается в коммиты.
.gitignore
__pycache__
Если вы используете CPython (что является самым распространенным, так как это эталонная реализация) и не хотите, чтобы эта папка создавалась, вы можете подавить ее появление, запустив интерпретатор с флагом -B, например:
python -B foo.py
Другой вариант, как указал tcaswell, — установить переменную окружения PYTHONDONTWRITEBYTECODE
в любое значение (согласно документации Python, в любую «непустую строку»).
Папка __pycache__
создаётся, когда вы используете строку:
import file_name
или пытаетесь получить информацию из другого файла, который вы создали. Это делает выполнение вашей программы немного быстрее при повторном запуске, так как при этом используется скомпилированный байт-код из кэша.
Когда вы импортируете модуль с помощью команды:
import file_name
Python сохраняет скомпилированный байт-код в директории __pycache__
, так что будущие импорты могут использовать его напрямую, не нужно снова парсить и компилировать исходный код.
Это происходит только при импорте файла, а не при простом запуске скрипта.
В предыдущих версиях байт-код кэшировался в виде файлов с расширением .pyc, которые беспорядочно размещались в той же директории, что и .py файлы. Начиная с Python 3, они были перемещены в подкаталог для большей упорядоченности.
PYTHONDONTWRITEBYTECODE — если эта переменная окружения установлена в ненулевую строку, Python не попытается записать .pyc файлы при импорте исходных модулей. Это эквивалентно указанию параметра -B.
В Python версии 2.x, при компиляции кода интерпретатором, создается файлы с расширением .pyc.
В Python версии 3.x компилятор создает папку pycache, в которой хранятся скомпилированные файлы. Эти файлы имеют расширение .pyc, но теперь они хранятся в подкаталоге, чтобы лучше организовать файлы и избежать конфликтов версий.
Пример содержимого каталога может выглядеть так:
alok@alok:~$ ls
module.py module.pyc __pycache__ test.py
alok@alok:~$
Здесь видно, что в каталоге присутствует как оригинальный файл module.py
, так и его скомпилированная версия module.pyc
, а также директория __pycache__
, которая содержит скомпилированные файлы для других модулей.
Питоновский интерпретатор компилирует файл скрипта *.py и сохраняет результаты компиляции в директории __pycache__
.
Когда проект запускается повторно, если интерпретатор определяет, что скрипт *.py не был изменён, он пропускает этап компиляции и запускает ранее сгенерированный файл *.pyc, хранящийся в папке __pycache__
.
Если проект сложный, использование кэша может значительно сократить время подготовки перед его запуском. В случае, если программа совсем небольшая, вы можете обойтись без кэширования, используя команду python -B abc.py
с опцией -B
.
Преобразование байтов в строку в Python 3
Как вернуть ключи словаря в виде списка в Python?
UnicodeDecodeError: Кодек 'charmap' не может декодировать байт X в позиции Y: символ отображается как <неопределённый>
Относительные импорты в Python 3
"TypeError: требуется объект, похожий на bytes, а не 'str' при обработке содержимого файла в Python 3"