以下からの優秀な答えは使用マックスとこの後の画像やサウンド&私自身の研究/テストのような余分なデータファイルを追加する方法については、私はそのようなファイルを追加する最も簡単な方法であると考えているものを考え出しました。
あなたはライブの例を参照したい場合は、私のリポジトリがあり、ここで GitHubの上で。
注:これは、pyinstallerで--onefile
or -F
コマンドを使用してコンパイルするためのものです。
私の環境は次のとおりです。
2つのステップで問題を解決する
この問題を解決するには、アプリケーションに「バンドル」する必要のある追加のファイルがあることをPyinstallerに明確に通知する必要があります。
また、「相対」パスを使用する必要があります。これにより、PythonスクリプトまたはフリーズされたEXEとして実行されているアプリケーションを適切に実行できます。
そうは言っても、相対パスを持つことができる関数が必要です。Maxが投稿した関数を使用すると、相対パスを簡単に解決できます。
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)
次のステップは、アプリケーションの実行時にtempディレクトリに作成されるように、コンパイル時に追加ファイルを見つける場所をPyinstallerに指示する必要があることです。
ドキュメントに示されているように、この問題を2つの方法で解決できますが、私は自分の.specファイルを管理することを好みます。
まず、すでに.specファイルが必要です。私の場合、pyinstaller
追加の引数を使用して実行することで、必要なものを作成できました。ここで追加の引数を見つけることができます。このため、スペックファイルはあなたのスペックファイルと少し異なるように見えるかもしれませんが、重要な部分を説明した後、参照用にすべてを掲載します。
added_filesは、基本的にタプルのを含むリストである私の場合、私は、単一の画像を追加したいんだけど、あなたが使用して複数のICOの、PNGのかJPGのを追加することができます('app/img/*.ico', 'app/img')
ので、同様にあなたはまた、別のタプルを作成することもできadded_files = [ (), (), ()]
、複数の輸入を持っています
タプルの最初の部分では、追加するファイルまたはファイルのタイプと、それらを見つける場所を定義します。これをCTRL + Cと考えてください
タプルの2番目の部分は、パスを「app / img /」にして、.exeを実行したときに作成される一時ディレクトリに相対するようにファイルを配置するようにPyinstallerに指示します。これをCTRL + Vと考えてください
の下でa = Analysis([main...
、私はを設定しましたがdatas=added_files
、元々はそれdatas=[]
でしたが、インポートのリストをインポートしたいので、カスタムインポートを渡します。
EXEの特定のアイコンが必要でない限り、これを行う必要はありません。スペックファイルの下部にある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"
a.datas += ...
)の線は、本当に役に立ちました。pyinstallerのドキュメントでは使用について説明してCOLLECT
いますが、使用時にファイルをバイナリに入れることができません--onefile