28

ソースファイルを保持せずに、コンパイルされたファイル.pyのみに依存してPython アプリケーションを実行しようとしています。.pycただし、.pyソース ファイルを削除すると、インポート エラーが発生します。この機能は Python 2.7 では機能しますが、3.4 (新しい__pycache__構造) では機能しません。

サンプルのディレクトリ構造は次のとおりです。

package/
  __init__.py
  module.py

パイソン 2.7

まず、Python 2.7 を使用するとどうなるか見てみましょう (これは望ましい動作です)。

$ python2 -c "from package import module"
$ find package -name "*.py" -delete
$ python2 -c "from package import module"

すべて正常で、エラーはスローされません。これを行った後のディレクトリ構造は.pyc、元のファイルと並んでファイルとともに次のようになり.pyます。

package/
  __init__.pyc
  module.pyc

パイソン3.4

では、Python 3.4 で同じことを行いましょう。元のディレクトリ構造から始めます。

$ python3 -c "from package import module"
$ find package -name "*.py" -delete
$ python3 -c "from package import module"
 Traceback (most recent call last):
   File "<string>", line 1, in <module>
 ImportError: cannot import name 'module'

モジュールをインポートできません。python3 -c "import package"興味深いことに、この時点ではまだ安全に実行できますが、そこからモジュールを取得することはできません。この時点で、ディレクトリ構造は 2.7 の場合とは少し異なります。具体的には次のようになります。

package/
  __pycache__/
      __init__.cpython-34.pyc
      module.cpython-34.pyc

問題は次のとおりです。なぜ Python 3.4 は、与えられた.pycファイルだけを適切にインポート/実行できないのでしょうか? これは、すべての状況でソースを保持する必要があることを意味する望ましい動作ですか? それとも私は愚かな何かを逃していますか?

4

2 に答える 2

35

BrenBarn の回答にコメントを追加するのに十分な評判はありません。そこで、補足をいくつか。

compileallドキュメントによると:

-b

バイトコード ファイルを従来の場所と名前に書き込みます。これにより、別のバージョンの Python で作成されたバイトコード ファイルが上書きされる可能性があります。デフォルトでは、ファイルは PEP 3147 の場所と名前に書き込まれます。これにより、Python の複数のバージョンのバイトコード ファイルが共存できます。

python -m compileall -b .したがって、このディレクトリ内のすべてのコード ファイルを再帰的にコンパイルするために実行できます。

于 2015-09-14T03:56:53.083 に答える
31

PEPによると:

キャッシュされた pyc ファイルをファイル システムに残したまま、何らかの理由で foo.py ファイルが削除された可能性があります。ファイル__pycache__/foo.<magic>.pycが存在するが、それを作成するために使用された foo.py ファイルが存在しない場合、Python は foo のインポートを要求されたときに ImportError を発生させます。つまり、ソース ファイルが存在しない限り、Python はキャッシュ ディレクトリから pyc ファイルをインポートしません。

しかし:

ただし、ソースのないディストリビューションを引き続きサポートするために、ソース ファイルが見つからない場合、Python は、ソース ファイルがあった場所にある場合は、単独の pyc ファイルをインポートします。

__pycache__したがって、ソースのないディストリビューションは相互に排他的であるように思われます。ソースを削除する場合は、ソースがあったディレクトリに .pyc ファイルを移動する必要があります。

于 2014-08-07T01:33:11.953 に答える