元の.pyファイルの代わりにPythonスクリプトのバイトコードバージョン(.pycファイル)のみを配布することは可能ですか?私のアプリはPythonインタープリターを埋め込み、PyImport_Importを呼び出してスクリプトをロードします。.pycファイルを探してインポートするように指示するにはどうすればよいですか?
5 に答える
PythonソースツリーにTools/freezeとして含まれているフリーズツールを使用します。PythonバイトコードをC配列に変換します。Cコンパイラを使用すると、すべてのモジュールを新しいプログラムに埋め込んで、標準のPythonモジュールにリンクすることができます。
フリーズにはCコンパイラが必要であることに注意してください。
その他のユーティリティ:
1- PyInstaller
2- Py2Exe
3-スクイーズ
4 - cx_freeze
.pyライブラリとそのライブラリを使用する単純な.pyプログラムを作成することでそれを行いました。次に、ライブラリを.pycにコンパイルし、分散しました。プログラムを.pyソースとして、ライブラリをコンパイル済み.pycとして。
メインプログラムはC++で記述しているため、Pythonファイルを保護するために必要なことは何でもできます。たとえば、配布用に暗号化してから、ちょうど間に合うように復号化して、Pythonインタープリターにインポートすることができます。
PyImport_Importを使用しているため__import__
、ファイルからではなくメモリバッファからモジュールをインポートする独自のフックを作成できます。そのため、.pycファイルへの変換はすべてメモリ内で行われ、ディスク上に理解できるPythonコードはまったくありません。
py2exeを使用してスタンドアロンプログラムを作成する場合、.pycファイルのみを取得するため、これは問題にはなりません。
通常、Pythonに.pycファイルを探すように指示する必要はありませんが、とにかくそうします。新しい.pyソースファイルがある場合にのみ、これが使用されます。
ただし、ソースコードの保護レベルはそれほど高くない場合があります。
インタラクティブインタプリタでは、これは自動的に行われます。.pyがない場合でも、.pycは引き続き使用されます。
$ echo 'print "hello"' > test.py
$ python -m compileall .
$ rm test.py
$ python -m test
hello
$
それがAPIで同じように機能するかどうか試してみてください。
追加するために編集:あなたのコード保護がかなり弱いという点で私はBerに同意します。-Oは、プログラムの動作を変更しない場合はdocstringを削除します。これにより、動作の再構築が難しくなる可能性がありますが、実際には何らかのバイトコードの難読化が必要になります。
Python用の既製の難読化ツールが存在するかどうかはわかりませんが、時間を費やしたい/投資できる場合は、これは実行可能に聞こえます(そして、それを行うのが馬鹿げていると感じず、独自のインタプリタを出荷できます)。