web-dev-qa-db-ja.com

.pycファイルはいつ更新されますか?

「.pyc」ファイルは、プレーンテキストの「.py」ファイルのコンパイル済みバージョンであり、プログラムをより高速に実行するために実行時に作成されることを理解しています。しかし、私はいくつかのことを観察しました:

  1. 「py」ファイルを変更すると、プログラムの動作が変わります。これは、「py」ファイルがコンパイルされるか、少なくとも何らかのハッシュプロセスを経るか、タイムスタンプを比較して、再コンパイルするかどうかを判断することを示します。
  2. すべての「.pyc」ファイル(rm *.pyc)プログラムの動作が変わる場合があります。これは、「。py」の更新時にコンパイルされていないことを示します。

質問:

  • いつコンパイルするかをどのように決定しますか?
  • 開発中に彼らがより厳格なチェックを行うことを保証する方法はありますか?
83
Aaron Schif

.pycファイルは、そのpythonファイルが他のスクリプトによってインポートされた場合にのみ作成されます(上書きされる可能性があります。インポートが呼び出された場合、Python .pycファイルの内部タイムスタンプは、対応する.pyファイル。そうである場合、.pyc;そうでない場合、または.pycはまだ存在しません。Pythonは.pyファイルを.pycそしてそれをロードします。

「より厳密なチェック」とはどういう意味ですか?

70

対応するコード要素がインポートされるたびに生成される.pycファイル。対応するコードファイルが更新されている場合は更新されます。 .pycファイルが削除されると、それらは自動的に再生成されます。ただし、対応するコードファイルが削除されると、not自動的に削除されます。

これは、ファイルレベルのリファクタリング中にいくつかの本当に楽しいバグを引き起こす可能性があります。

まず第一に、あなたは自分のマシンでのみ動作し、他の人では動作しないコードをプッシュすることになります。削除したファイルへの参照がダングリングしている場合、関連する.pycファイルを手動で削除しなくても、.pycファイルはインポートで使用できるため、これらはローカルで機能します。これは、適切に構成されたバージョン管理システムが.pycファイルではなく.pyファイルのみを中央リポジトリにプッシュするという事実と複雑です。つまり、コードは「インポートテスト」に合格できます(すべて正常にインポートできます)。他の人のコンピューターで作業します。

次に、パッケージをモジュールに変換すると、かなりひどいバグが発生する可能性があります。パッケージ(___init__.py_ファイルのあるフォルダー)をモジュール(.pyファイル)に変換すると、そのパッケージを表していた.pycファイルが残ります。特に、___init__.pyc_は残ります。したがって、重要ではないコードを含むパッケージfooがある場合は、後でそのパッケージを削除し、関数def bar(): passを含むファイルfoo.pyを作成して実行します。

_from foo import bar
_

あなたが得る:

_ImportError: cannot import name bar
_

pythonはまだfooパッケージの古い.pycファイルを使用していますが、どれもbarを定義していません。ファイル。

これらの両方の(およびおそらく他の)理由の結果として、次のbashの行のように、デプロイメントコードとテストコードで.pycファイルを削除する必要があります。

_find . -name '*.pyc' -delete
_

また、python 2.6の時点で、.pycファイルを使用しないように_-B_フラグを指定してpythonを実行できます。 .pycファイルを回避する方法 詳細については。

参照: プロジェクトからすべての.pycファイルを削除するにはどうすればよいですか?

29
Zags