__Pycache__ nedir?


651

Anladığım kadarıyla, önbellek benzer dosyaların şifrelenmiş bir dosyasıdır.

__pycache__Klasörle ne yapıyoruz ? Kaynak kodumuz yerine insanlara verdiğimiz şey bu mu? Sadece girdi verilerim mi? Bu klasör oluşturulmaya devam ediyor, ne için?


29
"İnsanlara kaynak kodumuz yerine verdiğimiz şey bu mu?" - Hayır, kaynak kodunu güzel bir kurulabilir pakette veriyorsunuz, böylece kullanımı kolay.
Lennart Regebro

79
Henüz kimseden bahsetmedi, ancak önbellek tanımınız tuhaf. Önbellek, verileri depolayan bir bileşendir, böylece bu veriler için gelecekteki istekler daha hızlı sunulabilir .
Ricardo Cruz


1
Yana Python 3.8sen bir ortam değişkeni kullanabilirsiniz yerini değiştirmek : can sıkıcı önbellek dizinler için stackoverflow.com/a/57414308/1612318
Rotareti

Önbellek, tekrar ihtiyacınız olması durumunda bir şeyin kopyasını tutan bir şeydir, onu almak için orijinaline geri dönmek zorunda kalmazsınız. Orijinal yere gitmekten daha hızlı olacak şekilde tasarlanmıştır. Daha hızlı olabilir, çünkü bilgiyi önceden işlemek veya derlemek zorunda değildir. Veya daha hızlı depolama, örneğin RAM'deki bir disk önbelleği veya yerel bir diskteki bir web önbelleği olabilir. Doğası gereği şifreli değildir (bazen de olabilir) ve her zaman bir "benzer dosyaların dosyası" değildir - bir dosya, bir dosya yükü, RAM bloğu vb.
Olabilir

Yanıtlar:


518

Bir programı python'da çalıştırdığınızda, yorumlayıcı önce bayt kodunu derler (bu aşırı basitleştirmedir) ve bunu __pycache__klasörde saklar . Oraya bakarsanız, projenizin klasöründeki .py dosyalarının adlarını paylaşan bir grup dosya bulacaksınız, sadece uzantıları .pyc veya .pyo olacaktır. Bunlar, sırasıyla program dosyalarınızın bayt kodu ile derlenmiş ve optimize edilmiş bayt kodu ile derlenmiş sürümleridir.

Bir programcı olarak, büyük ölçüde görmezden gelebilirsiniz ... Tek yaptığı, programınızın biraz daha hızlı başlamasını sağlamak. Komut dosyalarınız değiştiğinde, bunlar yeniden derlenir ve dosyaları veya tüm klasörü silip programınızı tekrar çalıştırırsanız, yeniden görünürler (özellikle bu davranışı bastırmazsanız)

Cpython (başvuru uygulaması olduğu için en yaygın olanı) kullanıyorsanız ve bu klasörü istemiyorsanız, örneğin -B bayrağıyla yorumlayıcıyı başlatarak bu klasörü engelleyebilirsiniz.

python -B foo.py

Diğer bir seçenek, tcaswell tarafından belirtildiği gibi, ortam değişkenini PYTHONDONTWRITEBYTECODEherhangi bir değere ayarlamaktır (python'un man sayfasına göre, herhangi bir "boş olmayan dize").


48
Ortam değişkenini PYTHONDONTWRITEBYTECODE=<any_value>kalıcı olarak bastırmak için de ekleyebilirsiniz .
Mark Tolonen

11
Açıklığa kavuşturmak gerekirse, bu sadece Python 3 içindir, değil mi?
Joe J

11
@JoeJ evet, bence bu doğru. python2yanılmıyorsam, derlenen dosyaları orijinallerle aynı dizine koyar.
scott_fakename

27
ÖNEMLİ uyarılardan biri, .py dosyası eksikse, .py dosyası yerine önbelleğe alınmış .pyc dosyasının kullanılacağıdır. Pratikte, bu sadece modülleri sildiğinizde (veya yeniden adlandırdığınızda) olur, bu yüzden yaygın bir olay değildir, ancak bazı şeyler "orada" olmaya devam ederse, başınızı çizdikten sonra bulmaya çalışın. -adi * .pyc | kaynağınızdaki xargs rm muhtemelen iyi bir ilk tepkidir.
yacc143

34
find . -name '*.pyc' -deleteEvet, bul, bulunan dosyaları silmek için bir bayrak var, bu yüzden herhangi bir xargs shananigans kullanmak zorunda değilsiniz
vlad-ardelean

174

__pycache__derlenmiş ve yürütülmeye hazır Python 3 bayt kodunu içeren bir klasördür .

Performansa zarar verebileceğinden, bu dosyaları rutin olarak silmenizi veya geliştirme sırasında oluşturma işlemini bastırmanızı önermiyorum. Gerektiğinde temizlemek için özyinelemeli bir komutu hazır bulundurun (aşağıya bakın), çünkü bayt kodu kenar durumlarda eski haline gelebilir (yorumlara bakın).

Python programcıları genellikle bayt kodunu yok sayar. Gerçekten __pycache__ve *.pycortak satırlarda .gitignoredosyalarda görmek . Bayt kodu dağıtım amaçlı değildir ve dismodül kullanılarak sökülebilir .


OS X kullanıyorsanız, projenizin kök klasöründen aşağıdaki komutu çalıştırarak projenizdeki bu klasörlerin tümünü kolayca gizleyebilirsiniz.

find . -name '__pycache__' -exec chflags hidden {} \;

Python 2 __pycache__ile değiştirin *.pyc.

Bu, tüm bu dizinlerde (.pyc dosyaları) Finder / Textmate 2'ye bunları listelerden hariç tutmasını söyleyen bir bayrak ayarlar. Önemlisi bayt kodu orada, sadece gizli.

Yeni modüller oluşturursanız ve yeni bayt kodunu gizlemek veya gizli bayt kodu dosyalarını silmek isterseniz komutu yeniden çalıştırın.


Windows'ta eşdeğer komut (test edilmedi, toplu komut dosyası hoş geldiniz) olabilir:

dir * /s/b | findstr __pycache__ | attrib +h +s +r

Hangi proje sağ tık> gizle ... kullanarak klasörleri gizleme geçmekte aynıdır


Birim testlerini çalıştırmak, *.pycdosya ve __pycache__klasörleri silmenin gerçekten yararlı olduğu bir senaryodur (yorumlarda daha fazlası) . Ben aşağıdaki satırları kullanın ~/.bash_profileve sadece clgerektiğinde temizlemek için çalıştırın .

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

Kodu her çalıştırdığınızda bu geri alınmaz mı?
Holloway

2
@DoTheEvo: basitçe yaratılmaz, bu nedenle modülün bir sonraki yüklenmesinde hızlanma olmaz. Hata oluşmadı.
Petr Viktorin

7
Bu iyi bir cevap değil. Asker bu dosyaların ne için olduğunu bilmek istiyor. Bu cevap "bunun için endişelenme" diyor ve sonra onları yok ediyor.
ilginçtir6

36
Kesinlikle bunları silmek zahmetli : anlamsız değil. Python dosya değişikliklerini mutlu bir şekilde algılamayacak ve birçok durumda bir önbellek dosyasını çalıştırmayacak, sizi "neden hala çalışmıyorsa, kodu değiştirdim, neden hala var olmayan çağrılarda başarısız oluyor" saçmalıklarıyla duvara tırmanacak. Özellikle test çerçevelerinde, varsayılan olarak pycache en kötüsüdür.
Mike 'Pomax' Kamermans

2
"Bu dosyaları silmeyi zahmet etmemek" için bu tavsiyeye katılmıyorum - bunu en son Kenneth Reitz'in "How To Python" ("bytecode hüner") tarafından önerilen birçok kez gördük
Louis Maddox

38

__pycache__Satırı kullandığınızda bir klasör oluşturulur:

import file_name

veya oluşturduğunuz başka bir dosyadan bilgi almaya çalışın. Bu, programınızı ikinci kez çalıştırırken diğer dosyayı açmak için biraz daha hızlı hale getirir.


27

3.7+ dokümanın güncellenmiş yanıtı:

Modülleri yüklemeyi hızlandırmak için, Python her modülün derlenmiş sürümünü__pycache__ adın altındaki dizinde önbelleğe alır vemodule.version.pyc burada sürüm derlenmiş dosyanın biçimini kodlar; genellikle Python sürüm numarasını içerir. Örneğin, CPython 3.3 sürümünde spam.py'nin derlenmiş sürümü olarak önbelleğe alınır __pycache__/spam.cpython-33.pyc. Bu adlandırma kuralı, farklı sürümlerden derlenmiş modüllerin ve Python'un farklı sürümlerinin bir arada bulunmasına izin verir.

Kaynak: https://docs.python.org/3/tutorial/modules.html#compiled-python-files

Yani, bu dizin Python tarafından üretilir ve programlarınızın daha hızlı çalışmasını sağlamak için vardır. Kaynak kontrolüne bağlı olmamalı ve yerel kaynak kodunuzla barış içinde bir arada bulunmalıdır.


__pycache__python, derlenmiş python veya .pycdosyalar tarafından otomatik olarak oluşturulan bayt kodu önbellek dosyalarını içeren bir dizindir . "Yorumlanan" bir dil olan Python'un neden derlenmiş dosyaları olduğunu merak ediyor olabilirsiniz. Bu SO sorusu bunu ele alıyor (ve kesinlikle bu cevabı okumaya değer ).

Python belgeleri tam olarak nasıl çalıştığı ve neden var olduğu hakkında daha derinlemesine incelenir:

  • Python 3.2'ye eklenmiştir, çünkü mevcut .pycdosyaları aynı dizinde tutma sistemi, bir programın farklı sürümlerdeki Python yorumlayıcılarıyla çalıştırılması gibi çeşitli sorunlara neden olmuştur. Tam özellik spesifikasyonu için bkz. PEP 3174 .

5

resmi python öğretici Modüllerinden

Modülleri yüklemeyi hızlandırmak için, Python her modülün derlenmiş sürümünü __pycache__adın altındaki dizinde önbelleğe alır ve module.version.pycburada sürüm derlenmiş dosyanın biçimini kodlar; genellikle Python sürüm numarasını içerir. Örneğin, CPython 3.6 sürümünde spam.py'nin derlenmiş sürümü olarak önbelleğe alınır __pycache__/spam.cpython-36.pyc.

Python doc Programlama SSS bölümünden

Bir modül ilk kez içe aktarıldığında (veya geçerli derlenmiş dosya oluşturulduğundan bu yana kaynak dosya değiştiğinde), derlenmiş kodu içeren bir .pyc dosyası, dosyayı içeren __pycache__dizinin bir alt dizininde oluşturulmalıdır .py. .pycDosya aynı adı ile başlayan bir dosya adı olacak .pyolan dosyaya ve uçları .pycoluşturulduğu belli piton ikili bağlı olan bir orta bileşenle.


5

Bir python betiğinin yürütülmesi bayt kodunun bellekte oluşturulmasına ve program kapatılana kadar saklanmasına neden olur. Bir modülün içe aktarılması durumunda, daha hızlı yeniden kullanılabilirlik için Python, içe aktarılan modülün bayt kodunun önbelleğe alındığı bir önbellek .pyc (PYC 'Python' 'Derlendi') dosyası oluşturur. Fikir, yeniden içe aktarıldıklarında yeniden derlemeden (bir kez derleme, birden çok kez çalıştırma ilkesi) kaçınarak python modüllerinin yüklenmesini hızlandırmaktır.

Dosyanın adı modül adıyla aynıdır. İlk noktadan sonraki kısım, önbelleği (CPython olabilir) ve ardından sürüm numarasını oluşturan Python uygulamasını gösterir.


3

Python yorumlayıcısı * .py komut dosyasını derler ve derlemenin sonuçlarını __pycache__dizine kaydeder .

Proje yeniden yürütüldüğünde, yorumlayıcı * .py komut dosyasının değiştirilmediğini belirlerse, derleme adımını atlar ve __pycache__klasörde depolanan önceden oluşturulan * .pyc dosyasını çalıştırır .

Proje karmaşık olduğunda, proje daha kısa sürmeden önce hazırlık süresini yapabilirsiniz. Program çok küçük ise, kullanarak göz ardı edebilir python -B abc.pyile Bseçeneği.


3

Yorumlayıcı kodu derlediğinde Python Sürüm 2.x .pyc'ye sahip olacaktır .

Yorumlayıcı kodu derlediğinde Python Sürüm 3.x __pycache__ olacaktır .

alok@alok:~$ ls
module.py  module.pyc  __pycache__  test.py
alok@alok:~$

2

3.2 ve sonrasında Python, .pyc derlenmiş bayt kodu dosyalarını __pycache__, kaynak dosyalarınızın kendilerini oluşturan Python sürümünü tanımlayan dosya adlarıyla bulunduğu dizinde bulunan bir alt dizine kaydeder (örn. Script.cpython-33.pyc)


" Pycache " klasörü oluşturulmasını nasıl önleyebilirim ve tüm .pyc dosyalarının .py dosyasıyla aynı şekilde adlandırılması gerekir?
Ashwani

1

Bir modülü içe aktardığınızda ,

import file_name

Python, derlenen bayt kodunu __pycache__dizinde saklar, böylece gelecekteki içe aktarmalar, kaynağı yeniden ayrıştırmak ve derlemek yerine doğrudan kullanabilir.

Bunu yalnızca bir komut dosyası çalıştırmak için yapmaz, sadece bir dosya içe aktarıldığında.

(Önceki sürümler, önbelleğe alınan bayt kodunu .py dosyalarıyla aynı dizini dolduran .pyc dosyaları olarak depolamak için kullanılıyordu, ancak Python 3'ten başlayarak işleri daha düzenli hale getirmek için bir alt dizine taşındılar.)

PYTHONDONTWRITEBYTECODE ---> Bu boş olmayan bir dizeye ayarlanırsa, Python kaynak modüllerin içe aktarılmasında .pyc dosyaları yazmaya çalışmaz. Bu, -B seçeneğini belirtmeye eşdeğerdir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.