Apa itu __pycache__?

652

Dari apa yang saya mengerti, cache adalah file terenkripsi dari file serupa.

Apa yang kita lakukan dengan __pycache__folder itu? Apakah itu yang kami berikan kepada orang-orang dan bukan kode sumber kami? Apakah ini hanya data input saya? Folder ini terus dibuat, untuk apa?

pengguna2063042
sumber
29
"Apakah itu yang kita berikan kepada orang-orang alih-alih kode sumber kita?" - Tidak, Anda memberi mereka kode sumber dalam paket yang dapat diinstal yang bagus sehingga mudah digunakan.
Lennart Regebro
79
Belum ada yang menyebutkan, tetapi definisi cache Anda aneh. Cache adalah komponen yang menyimpan data sehingga permintaan di masa mendatang untuk data tersebut dapat dilayani lebih cepat .
Ricardo Cruz
4
Lihat: python.org/dev/peps/pep-3147
Mr_and_Mrs_D
1
Karena Python 3.8Anda dapat menggunakan variabel lingkungan untuk mengubah lokasi untuk direktori cache yang menjengkelkan: stackoverflow.com/a/57414308/1612318
Rotareti
Cache adalah sesuatu yang menyimpan salinan barang jika Anda membutuhkannya lagi, untuk menghemat Anda harus kembali ke aslinya untuk mendapatkannya. Ini dirancang agar lebih cepat daripada pergi ke tempat asli. Mungkin lebih cepat karena tidak perlu melakukan pra-proses atau kompilasi informasi. Atau mungkin penyimpanan lebih cepat, mis. Cache disk dalam RAM atau cache web pada disk lokal. Ini bukan sifatnya terenkripsi (meskipun kadang-kadang bisa jadi), dan itu tidak selalu merupakan "file file serupa" - itu bisa berupa file, beban file, blok RAM dll.
rjmunro

Jawaban:

519

Ketika Anda menjalankan sebuah program dengan python, interpreter mengkompilasinya untuk bytecode terlebih dahulu (ini adalah penyederhanaan yang berlebihan) dan menyimpannya dalam __pycache__folder. Jika Anda melihat di sana Anda akan menemukan banyak file berbagi nama file .py di folder proyek Anda, hanya ekstensi mereka akan menjadi .pyc atau .pyo. Ini adalah masing-masing versi bytecode-compiled dan dioptimalkan bytecode-compile file Anda.

Sebagai seorang programmer, Anda bisa mengabaikannya ... Yang dilakukannya hanyalah membuat program Anda mulai lebih cepat. Ketika skrip Anda berubah, mereka akan dikompilasi ulang, dan jika Anda menghapus file atau seluruh folder dan menjalankan program Anda lagi, mereka akan muncul kembali (kecuali Anda secara khusus menekan perilaku itu)

Jika Anda menggunakan cpython (yang merupakan yang paling umum, karena ini adalah implementasi referensi) dan Anda tidak ingin folder itu, maka Anda dapat menekannya dengan memulai penerjemah dengan flag -B, misalnya

python -B foo.py

Opsi lain, seperti dicatat oleh tcaswell, adalah mengatur variabel lingkungan PYTHONDONTWRITEBYTECODEke nilai apa pun (menurut halaman manual python, "string tidak kosong").

scott_fakename
sumber
48
Anda juga dapat menambahkan variabel lingkungan PYTHONDONTWRITEBYTECODE=<any_value>untuk menekannya secara permanen.
Mark Tolonen
11
Hanya untuk memperjelas, ini hanya untuk Python 3, benar?
Joe J
11
@ JoJ ya, saya pikir itu benar. python2menempatkan file yang dikompilasi di direktori yang sama dengan aslinya, jika saya tidak salah.
scott_fakename
27
Satu peringatan PENTING adalah bahwa file .pyc di-cache akan digunakan sebagai ganti file .py jika file .py tidak ada. Dalam praktiknya, ini hanya terjadi jika Anda menghapus (atau mengganti nama) modul, jadi itu bukan kejadian biasa, tetapi jika beberapa hal terus ada "di sana", setelah menggaruk-garuk kepala Anda, jalankan find. -nama * .pyc | xargs rm pada sumber Anda mungkin merupakan reaksi pertama yang baik.
yacc143
34
find . -name '*.pyc' -deleteYa, find memiliki flag untuk menghapus file yang ditemukan, jadi Anda tidak perlu menggunakan shananigans xargs
vlad-ardelean
174

__pycache__adalah folder yang mengandung bytecode Python 3 yang dikompilasi dan siap dieksekusi .

Saya tidak merekomendasikan menghapus file-file ini secara rutin atau menekan pembuatan selama pengembangan karena dapat merusak kinerja. Cukup siapkan perintah rekursif (lihat di bawah) untuk membersihkan bila diperlukan karena bytecode dapat menjadi basi pada kasus tepi (lihat komentar).

Pemrogram python biasanya mengabaikan bytecode. Memang __pycache__dan *.pycmerupakan baris umum untuk dilihat dalam .gitignorefile. Bytecode tidak dimaksudkan untuk distribusi dan dapat dibongkar menggunakan dismodul .


Jika Anda menggunakan OS X, Anda dapat dengan mudah menyembunyikan semua folder ini di proyek Anda dengan menjalankan perintah berikut dari folder root proyek Anda.

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

Ganti __pycache__dengan *.pycuntuk Python 2.

Ini menetapkan tanda pada semua direktori (file .pyc) yang memberitahukan Finder / Textmate 2 untuk mengeluarkannya dari daftar. Yang penting bytecode ada, itu hanya disembunyikan.

Jalankan kembali perintah jika Anda membuat modul baru dan ingin menyembunyikan bytecode baru atau jika Anda menghapus file bytecode yang tersembunyi.


Pada Windows, perintah yang setara mungkin (tidak diuji, diterima skrip batch):

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

Yang sama seperti melalui proyek menyembunyikan folder menggunakan klik kanan> sembunyikan ...


Menjalankan tes unit adalah satu skenario (lebih banyak di komentar) di mana menghapus *.pycfile dan __pycache__folder memang berguna. Saya menggunakan baris berikut di saya ~/.bash_profiledan hanya menjalankan cluntuk membersihkan bila diperlukan.

alias cpy='find . -name "__pycache__" -delete'
alias cpc='find . -name "*.pyc"       -delete'
...
alias cl='cpy && cpc && ...'
jeda baris
sumber
Bukankah ini akan dibatalkan setiap kali Anda menjalankan kode?
Holloway
2
@DoTheEvo: itu tidak bisa dibuat, jadi tidak ada speedup saat modul dimuat. Tidak ada kesalahan yang muncul.
Petr Viktorin
7
Ini bukan jawaban yang bagus. Penanya ingin tahu untuk apa file-file ini. Jawaban ini mengatakan "jangan khawatir tentang hal itu" dan kemudian membuat mereka menghilang.
interestinglythere
36
Benar-benar repot menghapus ini : itu tidak ada gunanya. Python dengan senang hati tidak akan mendeteksi perubahan file dan menjalankan file cache dalam banyak keadaan, membuat Anda kesulitan dengan "mengapa f masih tidak berfungsi, saya mengubah kode, mengapa masih gagal pada panggilan yang tidak ada" omong kosong. Terutama dalam kerangka uji, pycache-by-default adalah yang terburuk.
Mike 'Pomax' Kamermans
2
Saya tidak setuju dengan saran ini untuk "jangan repot-repot menghapus file-file ini" - telah melihat ini direkomendasikan berkali-kali, yang terbaru oleh Kenneth Reitz "How To Python" ("trik bytecode")
Louis Maddox
38

Sebuah __pycache__folder dibuat ketika Anda menggunakan baris:

import file_name

atau coba dapatkan informasi dari file lain yang telah Anda buat. Ini membuatnya sedikit lebih cepat ketika menjalankan program Anda untuk kedua kalinya untuk membuka file lainnya.

Aleks. S.
sumber
27

Jawaban yang diperbarui dari 3,7+ dokumen:

Untuk mempercepat memuat modul, Python cache versi dikompilasi dari setiap modul di __pycache__direktori di bawah nama module.version.pyc, di mana versi mengkodekan format file yang dikompilasi; umumnya berisi nomor versi Python. Misalnya, dalam rilis CPython 3.3 versi yang dikompilasi dari spam.py akan di-cache sebagai __pycache__/spam.cpython-33.pyc. Konvensi penamaan ini memungkinkan modul yang dikompilasi dari rilis yang berbeda dan versi yang berbeda dari Python untuk hidup berdampingan.

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

Yaitu, direktori ini dibuat oleh Python dan ada untuk membuat program Anda berjalan lebih cepat. Seharusnya tidak berkomitmen untuk kontrol sumber, dan harus hidup berdampingan dengan damai dengan kode sumber lokal Anda.


__pycache__adalah direktori yang berisi file cache bytecode yang secara otomatis dihasilkan oleh python, yaitu dikompilasi python, atau .pyc, file. Anda mungkin bertanya-tanya mengapa Python, bahasa "ditafsirkan", memiliki semua file yang dikompilasi. SO ini menjawab pertanyaan itu (dan pasti layak membaca jawaban ini ).

Python docs menggali lebih dalam tentang cara kerjanya dan mengapa ia ada:

  • Itu ditambahkan dalam python 3.2 karena sistem yang ada mempertahankan .pycfile dalam direktori yang sama menyebabkan berbagai masalah, seperti ketika sebuah program dijalankan dengan interpreter Python dari versi yang berbeda. Untuk spesifikasi fitur lengkap, lihat PEP 3174 .
FluxLemur
sumber
5

dari Modul tutorial python resmi

Untuk mempercepat memuat modul, Python cache versi dikompilasi dari setiap modul di __pycache__direktori di bawah nama module.version.pyc, di mana versi mengkodekan format file yang dikompilasi; umumnya berisi nomor versi Python. Misalnya, dalam rilis CPython 3.6 versi yang dikompilasi dari spam.py akan di-cache sebagai __pycache__/spam.cpython-36.pyc.

dari Python doc Programming FAQs

Ketika modul diimpor untuk pertama kalinya (atau ketika file sumber telah berubah sejak file terkompilasi saat ini dibuat) file .pyc yang berisi kode yang dikompilasi harus dibuat dalam __pycache__subdirektori dari direktori yang berisi .pyfile tersebut. The .pycFile akan memiliki nama file yang dimulai dengan nama yang sama dengan .pyfile, dan berakhir dengan .pyc, dengan komponen menengah yang tergantung pada biner python tertentu yang menciptakannya.

Yossarian42
sumber
5

Eksekusi skrip python akan menyebabkan kode byte dihasilkan dalam memori dan disimpan hingga program dimatikan. Jika modul diimpor, agar dapat digunakan kembali lebih cepat, Python akan membuat file cache .pyc (PYC adalah 'Python' 'Dikompilasi') di mana kode byte modul yang diimpor di-cache. Ide adalah untuk mempercepat memuat modul python dengan menghindari kompilasi ulang (kompilasi sekali, jalankan kebijakan beberapa kali) ketika mereka diimpor kembali.

Nama file sama dengan nama modul. Bagian setelah titik awal menunjukkan implementasi Python yang membuat cache (bisa CPython) diikuti oleh nomor versinya.

TechFree
sumber
3

Interpreter python mengkompilasi file skrip * .py dan menyimpan hasil kompilasi ke __pycache__direktori.

Ketika proyek dieksekusi lagi, jika interpreter mengidentifikasi bahwa skrip * .py belum dimodifikasi, skrip tersebut melewatkan langkah kompilasi dan menjalankan file * .pyc yang dihasilkan sebelumnya yang disimpan dalam __pycache__folder.

Ketika proyek ini kompleks, Anda dapat membuat waktu persiapan sebelum proyek berjalan lebih pendek. Jika program ini terlalu kecil, Anda dapat mengabaikan bahwa dengan menggunakan python -B abc.pydengan Bpilihan.

Marcus Thornton
sumber
3

Python Version 2.x akan memiliki .pyc ketika interpreter mengkompilasi kode.

Versi Python 3.x akan memiliki __pycache__ ketika penerjemah mengkompilasi kode.

alok@alok:~$ ls
module.py  module.pyc  __pycache__  test.py
alok@alok:~$
Alok Tiwari
sumber
2

Dalam 3.2 dan yang lebih baru, Python menyimpan .pyc mengkompilasi file kode byte dalam sub-direktori bernama yang __pycache__terletak di direktori tempat file sumber Anda berada dengan nama file yang mengidentifikasi versi Python yang membuatnya (mis. Script.cpython-33.pyc)

Shashidhar Yalagi
sumber
Bagaimana saya bisa menghindari pembuatan folder " pycache " dan semua .pyc harus dinamai sama dengan file .py?
Ashwani
1

Saat Anda mengimpor modul ,

import file_name

Python menyimpan bytecode yang dikompilasi dalam __pycache__direktori sehingga impor di masa depan dapat menggunakannya secara langsung, daripada harus mengurai dan mengkompilasi sumber lagi.

Itu tidak melakukan itu hanya untuk menjalankan skrip, hanya ketika file diimpor.

(Versi sebelumnya digunakan untuk menyimpan bytecode yang di-cache sebagai file .pyc yang mengotori direktori yang sama dengan file .py, tetapi mulai dengan Python 3 mereka dipindahkan ke subdirektori untuk membuat hal-hal lebih rapi.)

PYTHONDONTWRITEBYTECODE ---> Jika ini disetel ke string yang tidak kosong, Python tidak akan mencoba menulis file .pyc pada impor modul sumber. Ini sama dengan menentukan opsi -B.

Ehsan Barkhordar
sumber