Што такое __pycache__?

З таго, што я разумею, кэш гэта зашыфраваны файл падобных файлаў.

Што мы робім з __ pycache __ тэчкі? Гэта тое, што мы даем людзям замест нашага зыходнага кода? Ці з'яўляецца гэта толькі мае ўваходныя дадзеныя? Гэтая тэчка працягвае атрымліваць створана, для чаго гэта?

361
дададзена аўтар Mr_and_Mrs_D, крыніца
«Ці з'яўляецца гэта тое, што мы даем людзям замест нашага зыходнага кода?» - Не, вы даеце ім зыходны код у добрым што ўстанаўлiваецца пакет, так што гэта простае ў выкарыстанні.
дададзена аўтар Lennart Regebro, крыніца
Ніхто не казаў яшчэ, але ваша вызначэнне кэша дзіўна. Cache даволі проста кампанент, які захоўвае дадзеныя так і будучыя запыты на гэтыя дадзеныя могуць быць пададзены хутчэй </а>.
дададзена аўтар Ricardo Cruz, крыніца

7 адказы

Пры запуску праграмы ў Python, інтэрпрэтатар кампілюе яго ў байт-код першым (гэта спрашчэннем) і захоўвае яго ў __ pycache __ тэчкі. Калі вы паглядзіце там вы знойдзеце кучу абмену файлаў імёнаў файлаў .py ў тэчцы вашага праекта, толькі іх пашырэнне будзе альбо .pyc або .pyo. Гэта байткод скампіляваць і аптымізаваныя байткод скампіляваных версій файлаў вашай праграмы, адпаведна.

Як праграміст, вы можаце ў значнай ступені проста ігнараваць яго ... Усё гэта робіць зрабіць запусціць вашу праграму трохі хутчэй. Пры змене вашых сцэнарыяў, яны будуць перакампіляваць, і калі вы выдаліце ​​файлы або ўсю тэчку і запусціць праграму яшчэ раз, яны будуць з'яўляцца (калі вы адмыслова не душыце такія паводзіны)

Калі вы выкарыстоўваеце CPython (які з'яўляецца найбольш распаўсюджаным, так як гэта эталонная рэалізацыя), і вы не жадаеце гэтую тэчку, то вы можаце здушыць яго, запусціўшы інтэрпрэтатар са сцягам -B, напрыклад,

python -B foo.py

Іншы варыянт, як адзначае tcaswell, каб усталяваць зменную асяроддзі PYTHONDONTWRITEBYTECODE на якое ён мае (па старонцы чалавека пітона, любы «не пустая радок»).

318
дададзена
Я бачыў гэты кэш з'яўляюцца з python2.7 пры выкарыстанні py.test - Я лічу, што ён выкарыстоўвае яго, каб ажыццявіць яго сцвярджаюць паводзіны.
дададзена аўтар meowsqueak, крыніца
<�Код> знайсці. -name «* .pyc» -Выдаліць Так, знайсці мае сьцяг для выдалення знойдзеных файлаў, так што вы не павінны выкарыстоўваць любыя xargs shananigans
дададзена аўтар vlad-ardelean, крыніца
Ці можна перамясціць гэтыя тэчкі ў іншае месца? Я спрабую ачысціць мой каталог імя карыстальніка.
дададзена аўтар Moondra, крыніца
@JoeJ так, я думаю, што гэта праўда. <�Код> python2 змяшчае скампіляваныя файлы ў тым жа каталогу, што і арыгіналы, калі я не памыляюся.
дададзена аўтар scott_fakename, крыніца
Вы можаце таксама дадаць зменныя асяроддзі PYTHONDONTWRITEBYTECODE = , каб падавіць яго назаўжды.
дададзена аўтар Mark Tolonen, крыніца
Але вы ўсё яшчэ можаце выкарыстоўваць .pyc <�я> замест з .py, калі вам трэба што: проста скапіяваць яго з __ pycache __ .
дададзена аўтар Petr Viktorin, крыніца
@ Yacc143: Гэта адбываецца толькі тады, калі .pyc файл з'яўляецца каталогам, у якім .py файл будзе - гэта значыць, дзе Python 2 пакласці іх. Python 3 змяшчае іх у __ pycache __ , які не выкарыстоўваецца, калі .py файл не існуе.
дададзена аўтар Petr Viktorin, крыніца
@JoeJ Каб быць дакладным, ён быў прадстаўлены як частка Python 3.2.
дададзена аўтар spkersten, крыніца
Проста каб растлумачыць, што гэта толькі для Python 3, правільна?
дададзена аўтар Joe J, крыніца
Адна важная перасцярога ў тым, што ў кэшы .pyc файл будзе выкарыстоўвацца замест .py файла, калі .py файл адсутнічае. На практыцы гэта адбываецца толькі калі вы выдаліце ​​(або пераназавіце) модулі, так што гэта не звычайнае падзея, але калі нейкі матэрыял захоўвае да таго «там», пасля таго, як чухаць галаву, бегаючы знаходку. -name * .pyc | xargs ет ружену на ваш крыніца, верагодна, добрая першая рэакцыя.
дададзена аўтар yacc143, крыніца

__pycache__ is a folder containing Python 3 bytecode compiled and ready to be executed.

Не турбаваць выдалення гэтых файлаў, а таксама здушыць стварэнне, як гэта пашкодзіць прадукцыйнасці. Проста рэкурсіўная каманда гатовай (гл ніжэй), каб ачысціць пры неабходнасці ў байткод можа састарэць ў крайніх выпадках (гл каментароў).

Python праграмісты звычайна ігнаруюць байткод. Сапраўды __ pycache __ і *. Pyc з'яўляюцца агульнымі лініямі, каб убачыць у .gitignore файлы. Bytecode не прызначаная для распаўсюду і можа быць разабраны з дапамогай Дыс Модуль </а>.


Калі вы выкарыстоўваеце 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

Which is same as going through the project hiding folders using right-click > hide...


Выкананне модульных тэстаў з'яўляецца адзін сцэнар (больш у каментарах), дзе выдаленне *. Pyc файлы і __ pycache __ тэчкі сапраўды карысна. Я выкарыстоўваю наступныя радкі ў маім ~/.bash_profile і запусціць сл , каб ачысціць пры неабходнасці.

alias cpy='find . -name "__pycache__" -delete'
alias cpc='find . -name "*.pyc"       -delete'
...
alias cl='cpy && cpc && ...'

91
дададзена
гэта не зусім бессэнсоўна. Сінхранізацыя файлаў паміж кампутарамі будзе выклікаць модульныя тэсты на няўдачу
дададзена аўтар endolith, крыніца
Дзякуй, я палепшыў адказ
дададзена аўтар F. Malina, крыніца
Якія абставіны? За апошнія 10 гадоў, кожны раз, калі я падазраваў байткод быць праблемы гэта было на самай справе дзесьці ў іншым месцы.
дададзена аўтар F. Malina, крыніца
Не, я проста правяраў на Python 2 і 3 да двайны праверкі. Гэта будзе толькі адмяніць, калі выдаліць схаваныя файлы. Чым вам трэба запусціць яго зноў.
дададзена аўтар F. Malina, крыніца
<�Б> <�я> Абсалютна затлумляцца выдаленне гэтых </я>: гэта не мае сэнсу. Python будзе шчасліва ня выявіць змены файлаў і ўцякаюць файл кэша ў многіх выпадках зводзіць вас ўверх па сцяне з «чаму дыяфрагменнай робіць гэта да гэтага часу не працуе, я змяніў код, чаму ён яшчэ не ўдаецца на неіснуючыя званкі» нонсэнс. Асабліва ў рамках выпрабаванняў, pycache-па-змаўчанні з'яўляецца горшым.
дададзена аўтар Mike 'Pomax' Kamermans, крыніца
@DoTheEvo: ён проста не атрымлівае створаны, так што няма убыстрения наступнага разу, калі модуль загружаюцца. не падымаецца няма памылак.
дададзена аўтар Petr Viktorin, крыніца
Ці не будзе гэта быць адменены кожны раз, калі вы запускаеце код?
дададзена аўтар Holloway, крыніца
Гэта не добры адказ. Пытаючы хоча ведаць, што гэтыя файлы для. Гэты адказ кажа «не хвалюйцеся пра гэта», а затым прымушае іх знікнуць.
дададзена аўтар interestinglythere, крыніца
Я б не пагадзіўся з гэтым саветам, каб «не турбаваць выдаліць гэтыя файлы» - бачыў гэта рэкамендуецца шмат разоў, зусім нядаўна Kenneth Reitz ў" Як Python " (" байт-код трук ")
дададзена аўтар Louis Maddox, крыніца
няма Што адбудзецца, калі Там няма дазволу на стварэнне гэтых файлаў у каталогу, дзе запушчаны .py файл? Напрыклад, Linux/USR/долі/...
дададзена аўтар DoTheEvo, крыніца
Мая прычына для іх выдалення з'яўляецца тое, што я выкарыстоўваю CPack і NSIS на Windows, каб спакаваць некаторыя пітона ў ўсталёўнік. Без іх я не патрапіў у недарэчны мяжа 260 асмаленых для FilePath, і ўсё добра. З гэтым ... (Aaaargh !!!)
дададзена аўтар Neil Gatenby, крыніца

__Pycache__folder ствараецца, калі вы выкарыстоўваеце лінію

import file_name

або паспрабаваць атрымаць інфармацыю з іншага файла, які вы стварылі. Гэта робіць яго трохі хутчэй пры запуску праграмы на ваш другі раз, каб адкрыць іншы файл.

12
дададзена

__pycache__ is a directory that contains bytecode cache files that are automatically generated by python, namely compiled python, or .pyc, files. You might be wondering why Python, an "interpreted" language, has any compiled files at all. This SO question addresses that (and it's definitely worth reading this answer).

У асноўным,

  • гэта робіць ваша праграма працаваць трохі хутчэй,
  • Вы можаце наогул проста ігнараваць яго

Пітон дакументы ідуць у больш падрабязна пра тое, як менавіта гэта працуе і чаму яна існуе:

  • It was added in python 3.2 because the existing system of maintaining .pyc files in the same directory caused various problems, such as when a program was run with Python interpreters of different versions. For the full feature spec, see PEP 3174.
5
дададзена

Інтэрпрэтатар пітона кампілюе * .py файл сцэнарыя і захоўвае вынікі кампіляцыі ў __ pycache __ каталог.

Калі праект выконваецца зноў, калі інтэрпрэтатар вызначае, што * .py скрыпт не быў зменены, ён прапускае этап кампіляцыі і запускае згенераваны раней * .pyc файл, захаваны ў __ pycache __ тэчкі.

Калі праект з'яўляецца складаным, вы можаце зрабіць час падрыхтоўкі да пачатку рэалізацыі праекта выконваецца карацей. Калі праграма занадта малая, вы можаце ігнараваць, што пад час выкарыстаньня пітона -B abc.py з B <�код /> варыянт.

1
дададзена

pycache = Byte code compiled files of python

1
дададзена

У 3.2 і больш позніх версіях, Python захоўвае .pyc скампіляваных файлы байт-код у падкаталогу з імем __ pycache __ знаходзіцца ў каталогу, дзе вашыя зыходныя файлы пражываюць з імёнамі файлаў, якія ідэнтыфікуюць версію Python, які стварыў іх (напрыклад, сцэнар. CPython-33.pyc)

1
дададзена