回答:
-BスイッチをPythonインタープリターに提供するか、インタープリターを実行する前にPYTHONDONTWRITEBYTECODE環境変数を設定することにより、Pythonが .pycまたは.pyoファイルを書き込むのを防ぐことができるようになりました。この設定は
sys.dont_write_bytecode
変数としてPythonプログラムで使用でき 、Pythonコードは値を変更してインタープリターの動作を変更できます。
アップデート2010-11-27:Python 3.2は、.pyc
特別な__pycache__
サブフォルダーを導入することにより、ファイルでソースフォルダーが乱雑になる問題に対処しています。「Python 3.2の新機能-PYCリポジトリディレクトリ」を参照してください。
export PYTHONDONTWRITEBYTECODE=1
import sys
sys.dont_write_bytecode = True
site-packages/usercustomize.py
これをすべてのスクリプトに適用します。私にとって、このディレクトリはでした$HOME/.local/lib/python2.6/site-pacakges/usercustomize.py
。Cf. docs.python.org/2/tutorial/…– RobM、2014
import sys; sys.dont_write_bytecode = True
実際にはPython 2.3以降でそれを行う方法がありますが、少し難解です。これを理解しているかどうかはわかりませんが、次のことができます。
$ unzip -l /tmp/example.zip
Archive: /tmp/example.zip
Length Date Time Name
-------- ---- ---- ----
8467 11-26-02 22:30 jwzthreading.py
-------- -------
8467 1 file
$ ./python
Python 2.3 (#1, Aug 1 2003, 19:54:32)
>>> import sys
>>> sys.path.insert(0, '/tmp/example.zip') # Add .zip file to front of path
>>> import jwzthreading
>>> jwzthreading.__file__
'/tmp/example.zip/jwzthreading.py'
zipimportライブラリによると:
任意のファイルがZIPアーカイブに存在する可能性がありますが、ファイル.pyおよび.py [co]のみをインポートできます。動的モジュール(.pyd、.so)のZIPインポートは許可されていません。アーカイブに.pyファイルのみが含まれている場合、Pythonは対応する.pycまたは.pyoファイルを追加してアーカイブを変更しようとしないことに注意してください。つまり、ZIPアーカイブに.pycファイルが含まれていない場合、インポートはかなり遅くなる可能性があります。
したがって、ファイルをzip圧縮し、zipファイルをsys.pathに追加してインポートするだけです。
これをUNIX用に構築している場合は、次のレシピを使用してスクリプトをパッケージ化することも検討してください 。unixzip 実行可能ファイルですが、stdinを使用するか、sys.argsから何かを読み取る場合は、これを微調整する必要がある場合があります(それはあまり問題なく行われた)。
私の経験では、これが原因でパフォーマンスに大きな影響はありませんが、非常に大きなモジュールをこの方法でインポートする前に、よく考える必要があります。
sys.dont_write_bytecode = True
ソースで設定できますが、それは最初にロードされたpythonファイルにある必要があります。実行python somefile.py
すると、取得されませんsomefile.pyc
。
を使用setup.py
してユーティリティをインストールすると、起動スクリプトentry_points=
が設定さsys.dont_write_bytecode
れます。したがって、setuptoolsによって生成される「デフォルト」の起動スクリプトに依存することはできません。
自分でpythonファイルを引数としてPythonを起動する場合は、次のように指定できます-B
。
python -B somefile.py
somefile.pyc
とにかく生成されませんが.pyc
、他のファイルのファイルもインポートされません。
ユーティリティがmyutil
あり、それを変更できない場合、-Bはpythonインタープリターに渡されません。環境変数を設定して開始するだけですPYTHONDONTWRITEBYTECODE
:
PYTHONDONTWRITEBYTECODE=x myutil
Python 3.8以降では、環境変数PYTHONPYCACHEPREFIX
を使用してPythonのキャッシュディレクトリを定義できます。
Pythonのドキュメントから:
これが設定されている場合、Pythonは.pycファイルを、ソースツリー内のpycacheディレクトリではなく、このパスのミラーディレクトリツリーに書き込みます。これは、-X pycache_prefix = PATHオプションを指定するのと同じです。
例
./profile
Linuxで次の行を追加すると、
export PYTHONPYCACHEPREFIX="$HOME/.cache/cpython/"
Pythonは__pycache__
プロジェクトディレクトリに迷惑なディレクトリを作成せず、代わりにそれらをすべて下に置きます~/.cache/cpython/
ソリューションipython 6.2.1 using python 3.5.2
(Ubuntu 16.04およびWindows 10でテスト済み):
Ipython
インタプリタで%env PYTHONDONTWRITEBYTECODE =1
設定されてipython
いるか、での起動中に設定されているかどうかは考慮されません~/.ipython/profile-default/startup/00-startup.ipy
。代わりに以下を使用して~.ipython/profile-default/startup/00-startup.py
import sys
sys.dont_write_bytecode=True
私の知る限り、Pythonは「インポート」したすべてのモジュールをコンパイルします。ただし、pythonは「python script.py」を使用して実行されたpythonスクリプトをコンパイルしません(ただし、スクリプトがインポートするモジュールはコンパイルします)。
本当の質問は、なぜPythonにモジュールをコンパイルさせたくないのですか?それらが邪魔になっている場合は、おそらくこれらをクリーンアップする方法を自動化できます。
.pyc
ファイルがあることがよくあります。どういうわけか、クラス/モジュールを変更すると、.pyc
ファイルが更新されません。そのため、.py
ファイルを変更した後にインポートすると、ファイルが引き続き使用され、.pyc
エラーが発生します