pyc Dosyaları için Özel Dizin
Python’da herhangi bir modülü içe aktardığımızda, .py uzantılı modül dosyasının bulunduğu dizinde .pyc uzantılı bir önbellek dosyası oluşur. Bu önbellekleme mekanizması sayesinde, bu modül tekrar içe aktarılacağı zaman Python içe aktarma işlemini daha hızlı gerçekleştirebilir.
Python 3.2′ye kadar olan Python sürümlerinde bu .pyc uzantılı dosyalar, ana .py dosyasının bulunduğu dizin içinde oluşturuluyordu. Ancak bu durum Python’ın 3.2 sürümü ile birlikte değişti. Artık .pyc dosyaları doğrudan ana .py dosyasının bulunduğu dizin içinde değil, __pycache__ adlı özel bir alt dizin içinde oluşuyor.
Yeni sistemin nasıl çalıştığını görmek isterseniz, mesela masaüstünde bulunan test.py adlı bir dosyayı import test komutuyla içe aktarın. Eğer kullandığınız sürüm Python 3.2 veya üzeri ise masaüstünde yeni bir __pycache__ dizininin oluştuğunu göreceksiniz.
.pyc dosyaları ile ilgili olarak Python 3.2′nin getirdiği tek yenilik farklı bir dizin daha oluşturulması değildir. Bu yeni __pycache__ dizinini açtığınızda karşınıza test.cpython-32.pyc adında bir dosya çıktığını göreceksiniz. Gördüğünüz gibi, artık .pyc dosyalarının adı da farklı. Python’ın 3.2 öncesi sürümlerinde test.py adlı dosyanın önbelleklenmiş hali test.pyc adını taşıyordu. Ama 3.2 sonrası sürümlerde önbelleklenmiş dosya test.cpython32.pyc adını taşıyor.
Peki bütün bu değişikliklerin gerekçesi nedir?
Özellikle sistemde birden fazla Python sürümü kurulu olduğunda eski önbellekleme mekanizması bazı sorunlara yol açabiliyordu. Örneğin Python 2.7 yorumlayıcısı tarafından oluşturulmuş bir .pyc dosyasıyla karşılaşan Python 3.1 yorumlayıcısı bu .pyc dosyasının üzerine yazıp, Python 2.7 yorumlayıcısının o dosyayı kullanmasını engelleyebiliyordu.
Aslında bu sorunun temelinde, bütün Python sürümlerinin test.py gibi bir dosya için test.pyc adlı bir bellek dosyası araması yatıyor. İşte Python geliştiricileri bu sorunu çözmek için her Python derleyicisinin farklı bir bellek dosyası adı oluşturmasına karar verdi. Böylelikle artık Python 3.2 derleyicisi .pyc dosyalarını “modül_adı.cpython32.pyc” adıyla, Python 3.3 derleyicisi ise “modül_adı.cpython33.pyc” adıyla oluşturacak. Ayrıca bütün .pyc dosyaları tek bir __pycache__ dizini altında derli toplu bir şekilde bulunacağı için dosya kirliliğinin de önüne geçilmiş olacak.
Bütün bu değişikliklerin sonucu olarak artık bütün modüllerin bir de __cached__ adlı bir metodu var. Bu metot, önbelleklenmiş dosyanın adını tutuyor. Örneğin:
>>> import test >>> test.__cached__ '__pycache__/test.cpython-32.pyc'
Eğer bu yeni yapı içindeki “cpython-32″ kısmını almanız gerekirse şu kodları kullanabilirsiniz:
>>> import imp >>> imp.get_tag() 'cpython-32'
Ayrıca artık imp modülü de, bu yeni değişiklikler nedeniyle iki yeni metot daha kazandı:
>>> import imp >>> imp.cache_from_source("test.py") '__pycache__/test.cpython-32.pyc' >>> imp.source_from_cache("__pycache__/test.cpython-32.pyc") 'test.py'
Gördüğünüz gibi, cache_from_source() metodu, parametre olarak modül adını alıyor ve size bu modüle ait önbelleklenmiş dosyanın adını veriyor. Benzer şekilde source_from_cache() metodu ise parametre olarak önbelleklenmiş dosya adını alıyor ve size ana modülün adını veriyor.
Konuyla ilgili PEP:
http://www.python.org/dev/peps/pep-3147/
Resmi belge:
http://docs.python.org/dev/whatsnew/3.2.html#pep-3147-pyc-repository-directories



Son Yorumlar