Maxからの優れた回答と、画像や音声などの追加データ ファイルの追加に関するこの投稿と、私自身の調査/テストを使用して、そのようなファイルを追加する最も簡単な方法を見つけました。
実際の例を見たい場合は、私のリポジトリがGitHub にあります。
注: これは、pyinstallerで--onefile
orコマンドを使用してコンパイルするためのものです。-F
私の環境は以下の通りです。
2ステップで問題を解決
この問題を解決するには、アプリケーションに「バンドル」する必要がある余分なファイルがあることを Pyinstaller に具体的に伝える必要があります。
また、「相対」パスを使用する必要もあります。これにより、アプリケーションが Python スクリプトまたは Frozen EXE として実行されているときに適切に実行できるようになります。
そうは言っても、相対パスを持つことができる関数が必要です。Max Posted関数を使用すると、相対パスを簡単に解決できます。
def img_resource_path(relative_path):
""" Get absolute path to resource, works for dev and for PyInstaller """
try:
# PyInstaller creates a temp folder and stores path in _MEIPASS
base_path = sys._MEIPASS
except Exception:
base_path = os.path.abspath(".")
return os.path.join(base_path, relative_path)
上記の関数をこのように使用して、アプリがスクリプトまたは凍結された EXE として実行されているときにアプリケーション アイコンが表示されるようにします。
icon_path = img_resource_path("app/img/app_icon.ico")
root.wm_iconbitmap(icon_path)
次のステップは、アプリケーションの実行時に追加ファイルが一時ディレクトリに作成されるように、コンパイル時に追加ファイルを見つける場所を Pyinstaller に指示する必要があることです。
ドキュメントに示されているように、この問題を 2 つの方法で解決できますが、個人的には自分の .spec ファイルを管理する方が好きなので、その方法で行います。
まず、すでに .spec ファイルが必要です。私の場合、追加の引数を指定して実行することで、必要なものを作成できました。ここでpyinstaller
追加の引数を見つけることができます。このため、私のスペック ファイルはあなたのものとは少し異なるように見えるかもしれませんが、重要な部分を説明した後、参考のためにすべてを投稿します。
added_filesは本質的にタプルを含むリストです。私の場合、単一の画像のみを追加したいのですが、複数の ico、png、または jpg を使用して追加でき('app/img/*.ico', 'app/img')
ますadded_files = [ (), (), ()]
タプルの最初の部分では、追加するファイルまたはファイルの種類と、それらを見つける場所を定義します。これを CTRL+C と考えてください
タプルの 2 番目の部分は、Pyinstaller に、パス 'app/img/' を作成し、.exe を実行したときに作成される一時ディレクトリに関連するディレクトリにファイルを配置するように指示します。これを CTRL+V と考えてください。
の下a = Analysis([main...
に を設定datas=added_files
しました。元々はそうdatas=[]
でしたが、インポートのリストをインポートしたいので、カスタム インポートを渡します。
EXE の特定のアイコンが必要でない限り、これを行う必要はありません。spec ファイルの下部で、Pyinstaller にオプションで exe のアプリケーション アイコンを設定するように指示していますicon='app\\img\\app_icon.ico'
。
added_files = [
('app/img/app_icon.ico','app/img/')
]
a = Analysis(['main.py'],
pathex=['D:\\Github Repos\\Processes-Killer\\Process Killer'],
binaries=[],
datas=added_files,
hiddenimports=[],
hookspath=[],
runtime_hooks=[],
excludes=[],
win_no_prefer_redirects=False,
win_private_assemblies=False,
cipher=block_cipher,
noarchive=False)
pyz = PYZ(a.pure, a.zipped_data,
cipher=block_cipher)
exe = EXE(pyz,
a.scripts,
a.binaries,
a.zipfiles,
a.datas,
[],
name='Process Killer',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=True , uac_admin=True, icon='app\\img\\app_icon.ico')
EXE へのコンパイル
私はとても怠け者です。必要以上にタイピングするのは好きではありません。クリックするだけの .bat ファイルを作成しました。これを行う必要はありません。このコードは、コマンド プロンプト シェルで問題なく実行されます。
.spec ファイルにはすべてのコンパイル設定と引数 (別名オプション) が含まれているため、その .spec ファイルを Pyinstaller に渡すだけです。
pyinstaller.exe "Process Killer.spec"