Что такое __pycache__?
Из того, что я понимаю, кеш - это зашифрованный файл похожих файлов.
Что мы делаем с папкой __pycache__
? Это то, что мы даем людям вместо нашего исходного кода? Это только мои входные данные? Эта папка продолжает создаваться, для чего она?
Ответы
Ответ 1
Когда вы запускаете программу на python, интерпретатор сначала компилирует ее в байт-код (это упрощение) и сохраняет ее в папке __pycache__
. Если вы посмотрите там, вы найдете кучу файлов, которые будут совместно использовать имена файлов .py в папке проекта, только их расширения будут либо .pyc, либо .pyo. Это файлы, скомпилированные байт-кодами и оптимизированные с помощью байт-кода ваши файлы программ, соответственно.
Как программист, вы можете просто игнорировать его... Все, что он делает, это сделать вашу программу немного быстрее. Когда ваши скрипты меняются, они будут перекомпилированы, и если вы удалите файлы или всю папку и снова запустите свою программу, они снова появятся (если вы специально не подавите это поведение)
Если вы используете cpython (который является наиболее распространенным, так как он является эталонной реализацией), и вам не нужна эта папка, вы можете его подавить, запустив интерпретатор с помощью флага -B, например
python -B foo.py
Другим вариантом, как указано tcaswell, является установка переменной окружения PYTHONDONTWRITEBYTECODE
на любое значение (согласно странице руководства python, любой "непустой строке" ).
Ответ 2
__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 && ...'
Ответ 3
Папка __pycache__ создается при использовании строки
import file_name
или попробуйте получить информацию из другого файла, который вы создали. Это делает его немного быстрее при запуске программы во второй раз, чтобы открыть другой файл.
Ответ 4
__pycache__
- это каталог, содержащий файлы кеша байт-кода, которые автоматически создаются python, а именно скомпилированные файлы python или .pyc
. Вы можете быть удивлены, почему Python, "интерпретируемый" язык, вообще имеет какие-либо скомпилированные файлы. Этот ТАК вопрос решает это (и это определенно стоит прочитать этот ответ).
Документы по Python более подробно рассказывают о том, как именно он работает и почему он существует:
- Он был добавлен в python 3.2, потому что существующая система поддержки файлов
.pyc
в одном и том же каталоге вызывала различные проблемы, например, когда программа запускалась с интерпретаторами Python разных версий. Для полной спецификации функции см. PEP 3174.
Ответ 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
, со средним компонентом, который зависит от конкретного двоичного файла python, который его создал.
Ответ 6
Интерпретатор python компилирует файл сценария *.py и сохраняет результаты компиляции в каталог __pycache__
.
Когда проект выполняется снова, если интерпретатор обнаруживает, что сценарий *.py не был изменен, он пропускает этап компиляции и запускает ранее созданный файл *.pyc, хранящийся в папке __pycache__
.
Когда проект сложный, вы можете сократить время подготовки до запуска проекта. Если программа слишком мала, вы можете проигнорировать это, используя python -B abc.py
с опцией B
Ответ 7
В 3.2 и более поздних версиях Python сохраняет файлы скомпилированного байтового кода .pyc в подкаталоге с именем __pycache__
расположенном в каталоге, где находятся исходные файлы с именами файлов, которые идентифицируют версию Python, которая их создала (например, script.cpython-33.pyc).
Ответ 8
Выполнение скрипта Python приведет к тому, что байт-код будет сгенерирован в памяти и сохранен до завершения работы программы. В случае импорта модуля для более быстрого повторного использования Python создаст файл .pyc для кеша (PYC - это "Python" "Compiled"), в котором кэшируется байтовый код импортируемого модуля. Идея состоит в том, чтобы ускорить загрузку модулей Python, избегая повторной компиляции (компилировать один раз, запускать многократную политику) при их повторном импорте.
Имя файла совпадает с именем модуля. Часть после начальной точки указывает на реализацию Python, которая создала кэш (может быть CPython), за которым следует его номер версии.
Ответ 9
pycache= Байт-код скомпилированных файлов python
Ответ 10
Интерпретатор Python компилирует ваш код в эти кэшированные файлы и сохраняет их в эти папки в любое время, когда вы будете использовать
import something
оно появится