ソースファイルを保持せずに、コンパイルされたファイル.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
ファイルだけを適切にインポート/実行できないのでしょうか? これは、すべての状況でソースを保持する必要があることを意味する望ましい動作ですか? それとも私は愚かな何かを逃していますか?