Що таке __pycache__?


651

Як я розумію, кеш - це зашифрований файл подібних файлів.

Що ми робимо з __pycache__папкою? Це те, що ми надаємо людям замість нашого вихідного коду? Це лише мої вхідні дані? Ця папка постійно створюється, для чого вона потрібна?


29
"Це те, що ми надаємо людям замість нашого вихідного коду?" - Ні, ви даєте їм вихідний код у приємному встановленому пакеті, щоб його було легко використовувати.
Леннарт Регебро

79
Ніхто ще не згадував, але ваше визначення кеша є химерним. Кеш - просто компонент, який зберігає дані, щоб майбутні запити на ці дані могли бути швидше подані .
Рікардо Крус


1
Так як Python 3.8ви можете використовувати змінну оточення змінити місце розташування для дратівливих каталогів кешу: stackoverflow.com/a/57414308/1612318
Rotareti

Кеш - це те, що зберігає копію матеріалу, якщо вона вам знову потрібна, щоб заощадити вам, щоб повернутися до оригіналу. Він розроблений так, щоб швидше, ніж їхати на оригінальне місце. Це може бути швидше, оскільки не потрібно попередньо обробляти або збирати інформацію. Або це може бути швидше зберігання, наприклад, кеш-диск диска в оперативній пам'яті або веб-кеш на локальному диску. Це не за своєю природою зашифровано (хоча це іноді може бути), і це не завжди "файл подібних файлів" - це може бути файл, завантаження файлів, блок оперативної пам’яті тощо
rjmunro

Відповіді:


518

Коли ви запускаєте програму в python, інтерпретатор збирає її спочатку в байт-код (це надмірне спрощення) і зберігає її в __pycache__папці. Якщо ви заглянете туди, ви знайдете в папці свого проекту кучу файлів, які мають імена файлів .py, лише їх розширення будуть .pyc або .pyo. Це компільовані байт-коди та оптимізовані версії файлів вашої програми, складені байт-кодом.

Як програміст, ви можете в основному просто проігнорувати це ... Все, що він робить, це змусити вашу програму запуститись трохи швидше. Коли ваші сценарії зміняться, вони будуть перекомпільовані, і якщо ви видалите файли або всю папку і запустите програму ще раз, вони знову з’являться (якщо ви спеціально не пригнічуєте таку поведінку)

Якщо ви використовуєте cpython (який є найпоширенішим, оскільки це посилання на реалізацію), і вам не потрібна ця папка, тоді ви можете придушити її, запустивши інтерпретатор із прапорцем -B, наприклад

python -B foo.py

Іншим варіантом, як зазначає tcaswell, є встановлення змінної середовища PYTHONDONTWRITEBYTECODEдля будь-якого значення (згідно зі сторінкою python, будь-яка "не порожня рядок").


48
Ви також можете додати змінну оточення, PYTHONDONTWRITEBYTECODE=<any_value>щоб назавжди придушити її.
Марк Толонен

11
Просто для уточнення, це лише для Python 3, правильно?
Джо J

11
@JoeJ так, я думаю, що це правда. python2поміщає складені файли в той самий каталог, що й оригінали, якщо я не помиляюся.
scott_fakename

27
Одне ВАЖЛИВО застереження полягає в тому, що кешований .pyc файл буде використаний замість файлу .py, якщо файл .py відсутній. На практиці це відбувається лише в тому випадку, якщо ви видаляєте (або перейменовуєте) модулі, тож це не є звичайною появою, але якщо деякі речі продовжують залишатися "там", після того, як почухаєте голову, запустіть пошук. -імен * .pyc | xargs rm у вашому джерелі - це, мабуть, хороша перша реакція.
yacc143

34
find . -name '*.pyc' -deleteТак, у значенні є прапор для видалення знайдених файлів, тому вам не доведеться використовувати жодні xargs shananigans
vlad-ardelean

174

__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 все ще не працює, я змінив код, чому він все ще не працює при неіснуючих дзвінках" дурницею. Особливо у тестових рамках, пікаш за замовчуванням є найгіршим.
Майк 'Pomax' Камерманс

2
Я б не погодився з цією порадою "не турбуватись про видалення цих файлів" - переглядав це рекомендовано багато разів, останнім часом у книзі Кеннета Рейца "Як пітон" ("трюк з байт-кодом")
Луї Маддокс

38

Під __pycache__час використання рядка створюється папка:

import file_name

або спробуйте отримати інформацію з іншого створеного файлу. Це робить трохи швидше при запуску програми вдруге, щоб відкрити інший файл.


27

Оновлена ​​відповідь від 3,7+ документів:

Для прискорення завантаження модулів Python кешує скомпільовану версію кожного модуля в __pycache__каталозі під назвою module.version.pyc, де версія кодує формат складеного файлу; він, як правило, містить номер версії Python. Наприклад, у версії CPython 3.3 складена версія 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 .

5

з офіційних модулів підручника пітона

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

від поширених запитань щодо програмування Python doc

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


5

Виконання сценарію python призведе до згенерування байтового коду в пам’яті та збереження до завершення роботи програми. Якщо модуль імпортується, для більш швидкого використання Python створить кеш-файл .pyc (PYC - "Python" "Compiled"), де кешується байт-код модуля, який імпортується. Ідея полягає в тому, щоб прискорити завантаження модулів python, уникаючи повторної компіляції (компілювати один раз, виконувати політику декількох разів) при їх повторному імпорті.

Ім'я файлу те саме, що ім'я модуля. Частина після початкової крапки вказує на реалізацію Python, який створив кеш (міг бути CPython) з подальшим номером його версії.


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.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.