2013-06-01 2 views
292

Насколько я понимаю, кеш является зашифрованным файлом подобных файлов.Что такое __pycache__?

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

+13

«Это то, что мы даем людям вместо нашего исходного кода?» - Нет, вы даете им исходный код в удобном установочном пакете, поэтому его легко использовать. –

+11

Пока никто не упомянул, но ваше определение кеша является странным. Кэш - это просто [компонент, в котором хранятся данные, поэтому будущие запросы на эти данные можно обслуживать быстрее] (https://en.wikipedia.org/wiki/Cache_ (вычисления)). –

+1

См.: Https://www.python.org/dev/peps/pep-3147/ –

ответ

263

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

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

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

python -B foo.py 

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

+28

Вы также можете добавить переменную окружения 'PYTHONDONTWRITEBYTECODE = ', чтобы постоянно ее подавлять. –

+3

Просто, чтобы уточнить, это только для Python 3, правильно? –

+6

@JoeJ да, я думаю, это правда. 'python2' помещает скомпилированные файлы в тот же каталог, что и оригиналы, если я не ошибаюсь. –

68

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

Не стесняйтесь удалять эти файлы, а также не подавлять создание. Это бессмысленно и на самом деле повредит работе.

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


Если вы используете 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 && ...' 
+0

Разве это не было бы отменено каждый раз, когда вы запускаете код? – Holloway

+0

Нет, я просто проверил на Python 2 и 3, чтобы дважды проверить. Это будет отменено только если вы удалите скрытые файлы. Затем вам нужно запустить его снова. –

+0

Что произойдет, если у вас нет разрешения на создание этих файлов в каталоге, где запущен файл .py? Например, linux/usr/share/... – DoTheEvo

1

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

1

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

В основном,

  • это делает вашу программу работать немного быстрее
  • обычно можно просто игнорировать его

Питон документы идут в более подробно о том, как именно это работает и почему это существует:

  • It was added in python 3.2 поскольку существующая система поддержания .pyc файлы в том же каталоге вызвали различные проблемы, например, когда была запущена программа с интерпретаторами Python разных версий. Полный спектр функций см. В разделе PEP 3174.
2

__pycache__folder создается при использовании линии

import file_name 

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

Смежные вопросы