Что такое __pycache__?

653

Из того, что я понимаю, кеш - это зашифрованный файл похожих файлов.

Что мы делаем с __pycache__папкой? Это то, что мы даем людям вместо нашего исходного кода? Это только мои входные данные? Эта папка продолжает создаваться, для чего она?

user2063042
источник
29
«Это то, что мы даем людям вместо нашего исходного кода?» - Нет, вы даете им исходный код в удобном для установки пакете, чтобы его было легко использовать.
Леннарт Регебро
79
Никто еще не упомянул, но ваше определение кеша странно. Кэш - это довольно простой компонент, который хранит данные, поэтому будущие запросы на эти данные могут быть обработаны быстрее .
Рикардо Круз
4
Смотрите: python.org/dev/peps/pep-3147
Mr_and_Mrs_D
1
Поскольку Python 3.8вы можете использовать переменную среды, чтобы изменить расположение раздражающих каталогов кеша: stackoverflow.com/a/57414308/1612318
Rotareti
Кеш - это то, что хранит копию материала на тот случай, если она понадобится вам снова, чтобы вам не пришлось возвращаться к оригиналу, чтобы получить его. Это разработано, чтобы быть быстрее, чем идти в исходное место. Это может быть быстрее, потому что не нужно предварительно обрабатывать или компилировать информацию. Или это может быть более быстрое хранилище, например, дисковый кеш в оперативной памяти или веб-кеш на локальном диске. Он не зашифрован по своей природе (хотя иногда это может быть), и это не всегда «файл схожих файлов» - это может быть файл, загрузка файлов, блок оперативной памяти и т. Д.
rjmunro

Ответы:

519

Когда вы запускаете программу на python, интерпретатор сначала компилирует ее в байт-код (это упрощение) и сохраняет ее в __pycache__папке. Если вы заглянете туда, то найдете папку с общими именами файлов .py в папке вашего проекта, только их расширения будут .pyc или .pyo. Это скомпилированные с помощью байт-кода и оптимизированные скомпилированные с помощью байт-кода версии файлов вашей программы, соответственно.

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

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

python -B foo.py

Другой вариант, как отметил tcaswell, - установить для переменной среды PYTHONDONTWRITEBYTECODEлюбое значение (в соответствии с man-страницей python любая «непустая строка»).

scott_fakename
источник
48
Вы также можете добавить переменную окружения, PYTHONDONTWRITEBYTECODE=<any_value>чтобы постоянно ее подавлять.
Марк Толонен
11
Просто чтобы уточнить, это только для Python 3, правильно?
Джо Дж
11
@JoeJ да, я думаю, что это правда. python2помещает скомпилированные файлы в тот же каталог, что и оригиналы, если я не ошибаюсь.
scott_fakename
27
Одно ВАЖНОЕ предостережение заключается в том, что кэшированный файл .pyc будет использоваться вместо файла .py, если файл .py отсутствует. На практике это происходит только в том случае, если вы удаляете (или переименовываете) модули, так что это не обычное явление, но если некоторые вещи продолжают оставаться «там», почесав голову, запустите find. имя * .pyc | xargs rm на вашем источнике, вероятно, является хорошей первой реакцией.
yacc143
34
find . -name '*.pyc' -deleteДа, команда find имеет флаг для удаления найденных файлов, поэтому вам не нужно использовать xargs shananigans
vlad-ardelean
175

__pycache__это папка, содержащая байт-код Python 3, скомпилированная и готовая к выполнению .

Я не рекомендую регулярно удалять эти файлы или подавлять создание во время разработки, поскольку это может снизить производительность. Просто подготовьте рекурсивную команду (см. Ниже) для очистки при необходимости, поскольку байт-код может устареть в крайних случаях (см. Комментарии).

Программисты Python обычно игнорируют байт-код. Действительно, __pycache__и *.pycэто общие строки, чтобы увидеть в .gitignoreфайлах. Байт-код не предназначен для распространения и может быть разобран с помощью disмодуля .


Если вы используете OS X, вы можете легко скрыть все эти папки в вашем проекте, выполнив следующую команду из корневой папки вашего проекта.

find . -name '__pycache__' -exec chflags hidden {} \;

Заменить __pycache__на *.pycдля Python 2.

Это устанавливает флаг для всех этих каталогов (файлов .pyc), сообщая Finder / Textmate 2 об их исключении из списков. Важно, что байт-код есть, он просто скрыт.

Повторите команду, если вы создаете новые модули и хотите скрыть новый байт-код или если вы удалили скрытые файлы байт-кода.


В Windows эквивалентная команда может быть (не проверена, приветствуется пакетный скрипт):

dir * /s/b | findstr __pycache__ | attrib +h +s +r

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


Запуск юнит-тестов - это один из сценариев (больше в комментариях), где удаление *.pycфайлов и __pycache__папок действительно полезно. Я использую следующие строки в моем ~/.bash_profileи просто запускаю clдля очистки, когда это необходимо.

alias cpy='find . -name "__pycache__" -delete'
alias cpc='find . -name "*.pyc"       -delete'
...
alias cl='cpy && cpc && ...'
Разрыв строки
источник
Разве это не будет отменено каждый раз, когда вы запускаете код?
Холлоуэй
2
@DoTheEvo: он просто не создается, поэтому при следующей загрузке модуль не будет ускорен. Ошибка не возникает.
Петр Викторин
7
Это не хороший ответ. Аскер хочет знать, для чего эти файлы. Этот ответ говорит: «Не беспокойся об этом», а затем заставляет их исчезнуть.
интересно там
36
Абсолютно потрудитесь удалить их : это не бессмысленно. К счастью, Python не будет обнаруживать изменения файлов и запускать файл кэша во многих обстоятельствах, заставляя вас задуматься над тем, «почему f все еще не работает, я изменил код, почему он все еще не работает на несуществующих вызовах». Особенно в тестовых средах pycache по умолчанию является худшим.
Майк 'Pomax' Камерманс
2
Я не согласился бы с этим советом, чтобы «не беспокоиться об удалении этих файлов» - я видел это рекомендованное много раз, совсем недавно Кеннет Рейтц «How To Python» («трюк с байт-кодом»)
Луи Мэддокс,
38

__pycache__Папка создается , когда вы используете линию:

import file_name

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

Aleks. С.
источник
27

Обновленный ответ из 3.7+ документов:

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

Источник: https://docs.python.org/3/tutorial/modules.html#compiled-python-files

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


__pycache__каталог, содержащий файлы кэша байт-кода, которые автоматически генерируются python, а именно скомпилированный python или .pycфайлы. Вы можете быть удивлены, почему Python, «интерпретируемый» язык, вообще имеет какие-либо скомпилированные файлы. Этот SO вопрос решает эту проблему (и этот ответ определенно стоит прочитать ).

Документы по Python более подробно рассказывают о том, как именно он работает и почему он существует:

  • Он был добавлен в python 3.2, потому что существующая система поддержки .pycфайлов в одном каталоге вызывала различные проблемы, например, когда программа запускалась с интерпретаторами Python разных версий. Для полной спецификации функции см. PEP 3174 .
FluxLemur
источник
5

из официального учебного модуля Python

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

из часто задаваемых вопросов по программированию на Python doc

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

Yossarian42
источник
5

Выполнение скрипта Python приведет к тому, что байт-код будет сгенерирован в памяти и сохранен до завершения работы программы. В случае импорта модуля для более быстрого повторного использования Python создаст файл .pyc для кеша (PYC - это «Python» «Compiled»), в котором кэшируется байтовый код импортируемого модуля. Идея состоит в том, чтобы ускорить загрузку модулей Python, избегая повторной компиляции (компилировать один раз, выполнять несколько раз политику), когда они реимпортируются.

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

TechFree
источник
3

Интерпретатор python компилирует файл сценария * .py и сохраняет результаты компиляции в __pycache__каталоге.

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

Если проект сложный, вы можете сократить время подготовки до его запуска. Если программа слишком мала, вы можете игнорировать , что при использовании python -B abc.pyс Bопцией.

Маркус Торнтон
источник
3

Python версии 2.x будет иметь .pyc, когда интерпретатор компилирует код.

Python версии 3.x будет иметь __pycache__, когда интерпретатор компилирует код.

alok@alok:~$ ls
module.py  module.pyc  __pycache__  test.py
alok@alok:~$
Алок Тивари
источник
2

В 3.2 и более поздних версиях Python сохраняет файлы скомпилированного байтового кода .pyc в подкаталоге с именем, __pycache__расположенном в каталоге, где находятся исходные файлы с именами файлов, которые идентифицируют версию Python, которая их создала (например, script.cpython-33.pyc).

Шашидхар Ялаги
источник
Как я могу избежать создания папки " pycache ", и все .pyc должны быть названы так же, как файл .py?
Ашвани
1

Когда вы импортируете модуль ,

import file_name

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

Это не делается для простого запуска скрипта, только когда файл импортирован.

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

PYTHONDONTWRITEBYTECODE ---> Если для этого параметра задана непустая строка, Python не будет пытаться записывать файлы .pyc при импорте исходных модулей. Это эквивалентно указанию опции -B.

Эхсан Бархордар
источник