回答:
適切にパッケージ化されたPythonアプリケーションは、ファイルのインストールが行われた後に.pyc
実行されるスクリプトでファイルにコンパイルされます。これは、パッケージガイドラインに従って、その時点で使用しているPythonインストールに採用できるようにするために必要です。ファイルはシステムに非常に固有であることを忘れないでください(Pythonのバージョンと依存関係)。.pyc
したがって、すべての.pyo
および.pyc
ファイルは、パッケージで明確に除外され、Lintianによってエラーとしてタグ付けされます。
コンパイルされたpythonソースファイルをパッケージに含めないでください。これらのファイルはパッケージから削除し、パッケージのインストール時にpostinstで作成する必要があります。
詳細については、Debian Pythonポリシーセクション2.6(Modules Byte-Compilation)を参照してください。
重大度:深刻、確実性:確実
python-numpy
このインストール後の場合、バイトコンパイルはpycentralのdebhelperフックによって処理されます。インストール後は次のようになります。
ls -l /usr/lib/python2.7/dist-packages/numpy
lrwxrwxrwx 1 root root 47 Mar 20 2012 add_newdocs.py -> ../../../../share/pyshared/numpy/add_newdocs.py
-rw-r--r-- 1 root root 251912 Aug 6 22:06 add_newdocs.pyc
これらの.pyc
/ .pyo
ファイルが実行時に最初のアプリケーションの起動時に予期したとおりにコンパイルされない理由は次のとおりです。
Pythonファイルはシステム全体のディレクトリにインストールされ、システム上のすべてのユーザーが使用できます。ユーザーがアプリケーションを起動すると、Pythonインタープリターは.py
ファイルを読み取ることができますが、ディレクトリー(など/usr/lib/python2.7/dist-packages/
)に書き込むことはできません。これは、すべてのLinuxシステムの一般的なセキュリティの一部です。ユーザーはに書き込みを行うべきではありません/usr
。これはroot権限でのみ可能です。このため、APTフックはインストール時にPythonファイルをコンパイルします。1つ目はパッケージサイズを最小化すること、2つ目はPythonに関してシステムで何かが変更されたときにフックを再トリガーできるようにすることです。たとえば、アップグレード中に互換性がなくなったときに再コンパイルする必要があるためです。
ただし、これは実行時にコンパイルされる通常のユーザー所有のPythonファイルには影響しません。
/usr/lib/python2.7/dist-packages/numpy
- pyc
ファイルがあります。私はいくつかのインストールでそこを見たのを覚えています-プレーンなpyファイルしかありませんでした。だから、「バグを再現できない」みたいな。
.pyc
がまだ存在しない唯一の理由は、パッケージが完全にインストールされていないことです。開梱後、実行する必要がある他の手順があります。IIRC python-centralフックは、すべてのパッケージがインストールされた後にのみ実行されます。したがって、実行中または中断されたAPTセッションでパッケージをインストールすると、おそらくあなたが説明した観察を行うことができます。
/usr/share/pyshared/
自分自身に書き込み可能にする必要があります-最初の実行でpythonがファイルをコンパイルできるようにするためです。