Что такое __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 

оно появится