Pyinstaller が app を作成できない
解決したいこと
Pythonのtkinterを使用したプログラムを、pyinstallerでアプリケーション化しようとしたところ、エラーが発生しました。
解決方法を教えていただきたいです。
環境
- MacOS 10.12.6 Sierra
- Python 3.10.6
- pyinstaller 5.5
発生している問題・エラー
$ pyinstaller test.py --onefile --noconsole --distpath DIR
...
(中略)
...
11888 INFO: Appending PKG archive to EXE
11905 INFO: Fixing EXE headers for code signing
Traceback (most recent call last):
File "/Library/Frameworks/Python.framework/Versions/3.10/bin/pyinstaller", line 8, in <module>
sys.exit(run())
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/PyInstaller/__main__.py", line 179, in run
run_build(pyi_config, spec_file, **vars(args))
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/PyInstaller/__main__.py", line 60, in run_build
PyInstaller.building.build_main.main(pyi_config, spec_file, **kwargs)
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/PyInstaller/building/build_main.py", line 963, in main
build(specfile, distpath, workpath, clean_build)
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/PyInstaller/building/build_main.py", line 885, in build
exec(code, spec_namespace)
File "/~(中略)/test.spec", line 24, in <module>
exe = EXE(
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/PyInstaller/building/api.py", line 545, in __init__
self.__postinit__()
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/PyInstaller/building/datastruct.py", line 173, in __postinit__
self.assemble()
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/PyInstaller/building/api.py", line 776, in assemble
osxutils.fix_exe_for_code_signing(build_name)
File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/PyInstaller/utils/osx.py", line 179, in fix_exe_for_code_signing
assert len(sign_sec) == 0, "Executable contains code signature!"
AssertionError: Executable contains code signature!
ご意見・アドバイス等、よろしくお願いいたします。
2Answer
- macOS High Sierra 10.13.6
- python 3.12.3
- pyinstaller 6.7.0
バージョンが少し違いますが、次のpythonコードを同じオプションで pyinstaller しましたが、特にエラーになりませんでした。使用しているライブラリの差でしょうか。
import tkinter as tk
class Application(tk.Frame):
def __init__(self, master=None):
super().__init__(master)
self.master.geometry("300x200")
label = tk.Label(self.master, text="test", width=30, height=15, bg="red")
label.pack()
if __name__ == "__main__":
root = tk.Tk()
app = Application(master=root)
app.mainloop()
$ pyinstaller test.py --onefile --noconsole --distpath .
403 INFO: PyInstaller: 6.7.0, contrib hooks: 2024.6
404 INFO: Python: 3.12.3
426 INFO: Platform: macOS-10.13.6-x86_64-i386-64bit
428 INFO: wrote /Users/USERNAME/PATH/test.spec
440 INFO: Extending PYTHONPATH with paths ['/Users/USERNAME/PATH']
687 INFO: checking Analysis
701 INFO: checking PYZ
707 INFO: EXE target arch: x86_64
707 INFO: Code signing identity: None
719 INFO: checking PKG
722 INFO: Bootloader /Users/USERNAME/path/to/venv/lib/python3.12/site-
packages/PyInstaller/bootloader/Darwin-64bit/runw
722 INFO: checking EXE
724 INFO: checking BUNDLE
725 INFO: Building BUNDLE BUNDLE-00.toc
801 INFO: Signing the BUNDLE...
1010 INFO: Building BUNDLE BUNDLE-00.toc completed successfully.
$ ls test.*
test.py test.spec
test.app:
Contents
$
Comments
@bdrcc
Questioner@nak435 さんは実行できたんですね。
.pyファイル内で使用しているモジュールは以下の通りです。import tkinter as tk import tkinter.ttk as ttk import datetime import json import requests from tkmacosx import Button
import
文だけですが、上のライブラリを全部追加してみましたが、エラーとか起きませんでした。できたコマンドも起動できました。逆に @bdrcc さんは、
import tkinter as tk
だけのシンプルな pyファイルであっても、pyinstallerが失敗しますか?@bdrcc
Questionertest.pyimport tkinter as tk
pyinstaller test.py --onefile --noconsole --distpath DIR
上記の場合は、アプリケーションを作成できましたが、クリックすると「macOS10.13以降でないと使えない」と出ました。
また、
test2.pyimport tkinter as tk import tkinter.ttk as ttk import datetime import json import requests from tkmacosx import Button
の場合は、AssertionErrorが同様に出ているため、tkinter以外のモジュールの問題だ、とわかりました。
まずは、High Sierra にアップデートしてはどうでしょうか。
macappstores://apps.apple.com/jp/app/macos-high-sierra/id1246284741?mt=12
@bdrcc
Questionerimport tkinter as tk import datetime import json
import tkinter.ttk as ttk
またはfrom tkmacosx import Button
が入るとAssertionError
import requests
が入るとWARNING: The output directory "(中略)/pyworks/DIR/test2.app" and ALL ITS CONTENTS will be REMOVED! Continue? (y/N)
と表示されるようです。
ちなみに、下記のようなVersionです。
$ python3 -m pip list Package Version ------------------------- -------- (中略) pip 22.2.1 pyinstaller 5.5 pyinstaller-hooks-contrib 2024.6 requests 2.28.2 setuptools 63.2.0 tkmacosx 1.0.5 (中略)
@bdrcc
Questioner@nak435 さん、わかりました。アップデートしてみます。
WARNING: The output directory "/Users/ev60082/pyworks/DIR/test2.app" and ALL ITS CONTENTS will be REMOVED! Continue? (y/N)
これは、すでに test2.app が存在しているから「消しますよ」ってことではないでしょうか?
pyinstaller
のバージョンの違いが影響している気がします・・・$ python3 -m pip list Package Version ------------------------- ------------ pip 24.0 pyinstaller 6.8.0 pyinstaller-hooks-contrib 2024.7 requests 2.32.3 setuptools 70.0.0 thinker 1.1.1 tkmacosx 1.0.5
@bdrcc
Questionerこれは、すでに test2.app が存在しているから「消しますよ」ってことではないでしょうか?>
WARNING: The output directory "/Users/ev60082/pyworks/DIR/test2.app" and ALL ITS CONTENTS will be REMOVED! Continue? (y/N)
その通りでした。失礼いたしました。
High Sierraにアップデート後、pyinstallerを使用したところ、appを作成できました。
しかし、PC画面下に2回表示が出たものの、appが起動しませんでした(exec?は実行可能でした)pyinstaller、その他使用する外部モジュールを、 @nak435 さんと同じバージョンにして再度実行しましたが、結果は同じでした・・・。
前回回答時は、
起動できなかった$ ./test
起動できた$ open ./test.app
でしたが、今日改めて pyinstaller したところ、上のどちらでも起動きました。ソースコードは次の内容です。このコードで試してみてください。
import tkinter as tk import tkinter.ttk as ttk import datetime import json import requests from tkmacosx import Button class Application(tk.Frame): def __init__(self, master=None): super().__init__(master) self.master.geometry("300x200") label = tk.Label(self.master, text="test", width=30, height=15, bg="red") label.pack() if __name__ == "__main__": root = tk.Tk() app = Application(master=root) app.mainloop()
追伸;
High Sierra の Safari だと、Qiita記事がまともに開けません。Chrome と併用しています。
(逆にChrome だと開けないサイトがあり、Safari と併用)@bdrcc さんは、どうですか?
古い FireFox 115 をインストールしたら、これが一番安定している感じがします。
@bdrcc
Questionerいただいたコードで、appまで実行することができました。
ありがとうございます。ということは、あとは私が書いたプログラムでappが作成できれば・・・。
本の情報をAPIから抽出したり、情報をcsvに読み書きするプログラムです。拙いところは多々ありますが、そこは置いておいて・・・。
VScodeやexecでは問題なく作動します。しかし、appだけがうまく作動しません。
Qiita記事について、この質問の回答、その他のサイトは基本的に、chromeで問題なく開けています。
Sierraをインストールした後、Safariがまともに使えなくなったので、それ以降使用するのを控えています。今、Safariでqiitaを開いてみたところ、広告や各アイコンが正常に作動しませんでした。FireFoxはインストールしたことがないので、すみません。いただいたコードで、appまで実行することができました。
一旦、環境による『Pyinstaller が app を作成できない』問題は解決されたと考えてよいと思うのですが、最終目的は、@bdrcc さんのコードでappを作ることですから、pythonコードのどの行があり/なしで、できる/できない の境界なのかを、切り分けないとダメですね。
その境界が分かったところで、再度、Q&A上げるのがよいかと思います。
Qiita記事について、この質問の回答、その他のサイトは基本的に、chromeで問題なく開けています。
逆にChromeでダメなサイトはありませんか?
FireFox のダウンロードリンクです。(もし、よろしければ)