![見出し画像](https://assets.st-note.com/production/uploads/images/67997512/rectangle_large_type_2_a75963603fb9512a33513390d23199b7.png?width=1200)
Pythonを難読化しつつEXE化する方法
Pythonアプリを配布する際の覚書です。
スクリプト内容を難読化した上でEXE化する手順をまとめました。
パッケージ化にはPyinstaller、難読化にはPyArmorを使用します。
PyInstallerをそのまま使用するとWindownsDifenderやアンチウィルスソフトに引っかかって不便なのでその対策もします。
実行環境
・Windows10 Home 64bit
・Python 3.9.5
・pip 21.2.1
インストールしたもの
・PyInstaller 4.5.1
・PyArmor Trial Version 7.2.3
・wheel 0.37.0
Pyinstaller準備
参考記事
pipでインストールしたPyInstallerだと吐き出されたexeファイルがウィルス判定されることがあるため、前もって対策します。
どうやら、ブートローダを自前の環境でビルドすればいいらしいです。
①pyinstallerのリポジトリをクローンします。
※gitコマンドを使うには予めGitを入れておく必要があります。
git clone https://github.com/pyinstaller/pyinstaller
②カレントディレクトリを移動
cd pyinstaller/bootloader
③下記コマンドを実行
python ./waf distclean all
④ブートローダを構築します。
※Error: Building wheels requires the 'wheel' package. Please `pip install wheel` then try again.がでたらpip install wheelをしてから再度実行します。
python ../../setup.py install
PyArmor準備
pipでインストールします。
pip install pyarmor
EXE化手順
参考記事
コマンドプロンプトでパッケージ化したいスクリプトが置いてあるディレクトリへ移動して以下のコマンドを実行します。
-eの後の""内にpyinstallerへ渡すオプションを指定できるみたいです。
※xxx.pyがEXE化したいスクリプトです。
pyarmor pack -e " --onefile --noconsole" xxx.py
いちいちコマンド打つのが面倒なのでバッチファイルにしました。
pythonファイルをバッチにドラッグアンドドロップして使います。
ちなみに、スクリプト以外のリソースファイル(画像データとか)とかを含めたプロジェクトの場合はこんな感じのコマンドにすれば、実現できます。
以下はpythonスクリプトがあるディレクトリにresourcesというフォルダを作成してその中に必要なファイルを入れておく場合。
※リソースファイルは難読化されないので注意
pyarmor pack -e " --onefile --add-data='resources;resources'" xxx.py
exe化したスクリプトでresourcesフォルダ内のファイルを参照する場合はファイルのパス取得にご注意下さい。
以下のような関数を作って参照するといいみたいです。
参考記事
def resourcePath(filename):
if hasattr(sys, "_MEIPASS"):
return os.path.join(sys._MEIPASS, filename)
return os.path.join(filename)
#EXE化時のresourcesフォルダのファイル参照
print(resourcePath("resources/参照したいファイル名"))