2

*.pycPython 3.3 でバイトコンパイルされたファイルをロードするアプリケーションを作成しています。ソース コードを保護する (しようとする) ために*.pyc、対応するファイルなしでファイルを配布しています。*.py(はい、ここで述べたように、Python をバイト コンパイルして逆コンパイルを阻止しようとすることは、最も安全なオプションではありませんが、必要に応じて他のコード セキュリティ対策をいつでも追加できます。)

*.pycただし、元のファイルが配置されていない場合、Python はファイルをロードしないことがわかりました*.py( PEP 3147によると、ファイルは、*.pycファイルがあるディレクトリで呼び出されるサブディレクトリに保持され__pycache__ます*.py。私は自分のコードでこの規則に従っています。)

Python 2.7 を使用した私のプロジェクトの以前の反復では、Python ソースをバイト コンパイルし、生成さ*.pycれたファイルをファイルと同じディレクトリに配置しました*.py。それはうまくいきました。__pycache__明らかに、Python がフォルダーを見つける方法に問題があります。私は何を間違っていますか?(はい、適切に設定しました。そうしないと、デバッグ手段として挿入したときにファイルsys.pathが見つからないでしょう。)*.py

4

2 に答える 2

3

PEP 3147から:

py ソース ファイルが見つからない場合、内部の pyc ファイル__pycache__は無視されます。これにより、誤って古い pyc ファイルをインポートするという問題が解消されます。

下位互換性のために、Python は引き続き pyc のみのディストリビューションをサポートしますが、pyc ファイルが py ファイルが存在するはずのディレクトリに存在する場合、つまりディレクトリに存在しない場合にのみサポートします__pycache__。の外部にある pyc ファイル__pycache__は、py ソース ファイルが見つからない場合にのみインポートされます。

したがって、pyc のみのディストリビューションを作成する場合は、コンパイル済みのファイルを .py ファイルと同じ場所に配置する必要があります。PEP によると、compileallこの正確なレイアウトを作成するオプションがあるため、からコピーする必要はありません__pycache__。チェックしてください。

于 2013-02-13T22:16:03.540 に答える
2

*.pycファイルをディレクトリからコピーし、ファイル名から__pycache__削除.cpython-33しました。その後、Python は期待どおりにそれを見つけました。ありがとう、DSM!

于 2013-02-13T21:46:43.130 に答える