Dapatkah saya menjalankan interpreter python tanpa menghasilkan file .pyc yang telah dikompilasi?
268
Dari "Apa yang Baru di Python 2.6 - Perubahan Interpreter" :
Python sekarang dapat dicegah dari menulis file .pyc atau .pyo dengan memasok saklar -B ke interpreter Python, atau dengan mengatur variabel lingkungan PYTHONDONTWRITEBYTECODE sebelum menjalankan interpreter. Pengaturan ini tersedia untuk program Python sebagai
sys.dont_write_bytecode
variabel, dan kode Python dapat mengubah nilai untuk mengubah perilaku juru bahasa.
Pembaruan 2010-11-27: Python 3.2 membahas masalah mengacaukan folder sumber dengan .pyc
file dengan memperkenalkan __pycache__
subfolder khusus , lihat Apa yang Baru di Python 3.2 - PYC Repository Directories .
export PYTHONDONTWRITEBYTECODE=1
sumber
site-packages/usercustomize.py
untuk menjadikan ini berlaku untuk semua skrip Anda. Bagi saya, direktori ini dulu$HOME/.local/lib/python2.6/site-pacakges/usercustomize.py
. Lih docs.python.org/2/tutorial/…import sys; sys.dont_write_bytecode = True
Sebenarnya ada cara untuk melakukannya dengan Python 2.3+, tapi agak esoterik. Saya tidak tahu apakah Anda menyadarinya, tetapi Anda dapat melakukan hal berikut:
Menurut perpustakaan zipimport :
Jadi, yang harus Anda lakukan adalah meng-zip file, menambahkan zipfile ke sys.path Anda dan kemudian mengimpornya.
Jika Anda membuat ini untuk UNIX, Anda mungkin juga mempertimbangkan untuk mengemas skrip Anda menggunakan resep ini: unix zip executable , tetapi perhatikan bahwa Anda mungkin harus mengubah ini jika Anda berencana menggunakan stdin atau membaca apa pun dari sys.args (itu BISA dilakukan tanpa terlalu banyak kesulitan).
Dalam pengalaman saya kinerja tidak terlalu menderita karena ini, tetapi Anda harus berpikir dua kali sebelum mengimpor modul yang sangat besar dengan cara ini.
sumber
Dalam 2.5, tidak ada cara untuk menekannya, selain langkah-langkah seperti tidak memberikan pengguna akses tulis ke direktori.
Namun dalam python 2.6 dan 3.0, mungkin ada pengaturan dalam modul sys yang disebut "dont_write_bytecode" yang dapat diatur untuk menekan ini. Ini juga dapat diatur dengan melewatkan opsi "-B", atau mengatur variabel lingkungan "PYTHONDONTWRITEBYTECODE"
sumber
Anda dapat mengatur
sys.dont_write_bytecode = True
di sumber Anda, tetapi itu harus berada di file python pertama yang dimuat. Jika Anda mengeksekusipython somefile.py
maka Anda tidak akan mendapatkannyasomefile.pyc
.Ketika Anda menginstal utilitas menggunakan
setup.py
danentry_points=
Anda akan mengatursys.dont_write_bytecode
skrip startup. Jadi, Anda tidak dapat mengandalkan skrip startup "default" yang dihasilkan oleh setuptools.Jika Anda memulai Python dengan file python sebagai argumen sendiri, Anda dapat menentukan
-B
:somefile.pyc
toh tidak akan dihasilkan, tetapi tidak ada.pyc
file untuk file lain yang diimpor juga.Jika Anda memiliki beberapa utilitas
myutil
dan Anda tidak dapat mengubahnya, itu tidak akan meneruskan -B ke penerjemah python. Mulai saja dengan mengatur variabel lingkunganPYTHONDONTWRITEBYTECODE
:sumber
Saya memiliki beberapa test case di test suite dan sebelum saya menjalankan test suite di Terminal Mac seperti ini:
Menjalankan perintah dengan cara ini direktori saya sedang diisi dengan file .pyc. Saya mencoba metode yang dinyatakan di bawah ini dan itu memecahkan masalah:
Metode ini berfungsi jika Anda mengimpor test case ke dalam test suite dan menjalankan suite di baris perintah.
sumber
Dimulai dengan Python 3.8 Anda dapat menggunakan variabel lingkungan
PYTHONPYCACHEPREFIX
untuk menentukan direktori cache untuk Python.Dari dokumen Python:
Contoh
Jika Anda menambahkan baris berikut ke
./profile
Linux Anda:Python tidak akan membuat
__pycache__
direktori yang menjengkelkan di direktori proyek Anda, sebaliknya itu akan menempatkan semuanya~/.cache/cpython/
sumber
Anda bisa membuat direktori di mana modul Anda ada di read-only untuk pengguna yang menjalankan interpreter Python.
Saya tidak berpikir ada opsi yang lebih elegan. PEP 304 tampaknya merupakan upaya untuk memperkenalkan opsi sederhana untuk ini, tetapi tampaknya telah ditinggalkan.
Saya membayangkan mungkin ada beberapa masalah lain yang Anda coba selesaikan, yang menonaktifkan .py [co] tampaknya merupakan solusi, tetapi mungkin akan lebih baik untuk menyerang apa pun masalah asli ini.
sumber
Solusi untuk
ipython 6.2.1 using python 3.5.2
(Diuji pada Ubuntu 16.04 dan Windows 10):Ipython
tidak menghormati%env PYTHONDONTWRITEBYTECODE =1
jika diatur dalamipython
interpretor atau selama startup di~/.ipython/profile-default/startup/00-startup.ipy
. Alih-alih menggunakan yang berikut di~.ipython/profile-default/startup/00-startup.py
sumber
Sejauh yang saya tahu python akan mengkompilasi semua modul yang Anda "impor". Namun python TIDAK akan mengkompilasi skrip python dijalankan menggunakan: "python script.py" (namun akan mengkompilasi modul yang diimpor skrip).
Pertanyaan sebenarnya adalah mengapa Anda tidak ingin python mengkompilasi modul? Anda mungkin bisa mengotomatiskan cara membersihkan ini jika mereka menghalangi.
sumber
.pyc
file bytecode basi . Untuk beberapa alasan, ketika saya mengubah kelas / modul,.pyc
file tidak diperbarui. Jadi ketika saya mengimpornya setelah mengubah.py
file, itu masih akan menggunakan.pyc
file, yang mengarah ke kesalahan