質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.37%
Kivy

Kivyは、Pythonを用いたNUI開発のためのオープンソースフレームワーク。マルチタッチなど多くの入力に対応したNUIアプリなどを開発することができます。多くの環境で動作するクロスプラットフォームです。

PyInstaller

PyInstallerは、Pythonのスクリプトを一括でWindowsなどで動く実行可能ファイルに変換できるツールです。このツールを用いることで自作のPythonプログラムを別で使用する場合でもPythonをインストールする必要がありません。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

2回答

1378閲覧

kivyで作成したプロジェクトをpyinstallerでexeファイル化したい。

AnoGame

総合スコア1

Kivy

Kivyは、Pythonを用いたNUI開発のためのオープンソースフレームワーク。マルチタッチなど多くの入力に対応したNUIアプリなどを開発することができます。多くの環境で動作するクロスプラットフォームです。

PyInstaller

PyInstallerは、Pythonのスクリプトを一括でWindowsなどで動く実行可能ファイルに変換できるツールです。このツールを用いることで自作のPythonプログラムを別で使用する場合でもPythonをインストールする必要がありません。

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2023/04/09 09:31

実現したいこと

kivyで作成したプロジェクトをpyinstallerでexeファイル化したい。

前提

pythonのkivyを使って作ったプロジェクトをexeファイルとしてビルドしようとしています。
poetryでパッケージの依存関係を管理していたのですが、pyinstallerが参照する依存関係はまた別物ということで
一度目のビルドで足りていなかったローカルの依存関係をspecファイルに別途記載してからビルドするなどして、
1度目のビルドで発生した依存関係のエラーまでは解決できました。
しかし、新たに依存関係によるエラーが発生しました。これは、一度目のビルドで足りていなかった依存関係の子に当たる部分なので本来は発生しないものと考えています。
KV言語の特有のエラーかと思われるのですが、知見が足りないためお力を貸していただきたいです。

発生している問題・エラーメッセージ

D:\GitHub\wat\dist>wat.exe
[INFO ] [Logger ] Record log in C:\Users\xxx.kivy\logs\kivy_23-04-09_49.txt
[INFO ] [Kivy ] v2.1.0
[INFO ] [Kivy ] Installed at "C:\Users\xxx\AppData\Local\Temp_MEI193722\kivy_init_.pyc"
[INFO ] [Python ] v3.9.0 (tags/v3.9.0:9cf6752, Oct 5 2020, 15:34:40) [MSC v.1927 64 bit (AMD64)]
[INFO ] [Python ] Interpreter at "D:\GitHub\wat\dist\wat.exe"
[INFO ] [Logger ] Purge log fired. Processing...
[INFO ] [Logger ] Purge finished!
[INFO ] [KivyMD ] 1.1.1, git-Unknown, 2023-03-28 (installed at "C:\Users\xxx\AppData\Local\Temp_MEI193722\kivymd_init_.pyc")
[INFO ] [Factory ] 189 symbols loaded
[INFO ] [Image ] Providers: img_pil, img_sdl2 (img_tex, img_dds, img_ffpyplayer ignored)
[INFO ] [Text ] Provider: sdl2
[INFO ] [Window ] Provider: sdl2
[INFO ] [GL ] Using the "OpenGL" graphics system
[INFO ] [GL ] GLEW initialization succeeded
[INFO ] [GL ] Backend used <glew>
[INFO ] [GL ] OpenGL version <b'4.6.0 NVIDIA 511.23'>
[INFO ] [GL ] OpenGL vendor <b'NVIDIA Corporation'>
[INFO ] [GL ] OpenGL renderer <b'NVIDIA GeForce RTX 3060 Ti/PCIe/SSE2'>
[INFO ] [GL ] OpenGL parsed version: 4, 6
[INFO ] [GL ] Shading version <b'4.60 NVIDIA'>
[INFO ] [GL ] Texture max size <32768>
[INFO ] [GL ] Texture max units <32>
[INFO ] [Window ] auto add sdl2 input provider
[INFO ] [Window ] virtual keyboard not allowed, single mode, not docked
[INFO ] [Clipboard ] Provider: winctypes
--- Logging error ---
Traceback (most recent call last):
File "kivy\lang\parser.py", line 553, in execute_directives
File "<frozen importlib._bootstrap>", line 1109, in import
File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
File "<frozen importlib._bootstrap>", line 972, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
File "<frozen importlib._bootstrap>", line 984, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'src.ui.components.message_input_field'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "kivy\lang\parser.py", line 556, in execute_directives
File "<frozen importlib._bootstrap>", line 1109, in import
File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
File "<frozen importlib._bootstrap>", line 984, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'src.ui.components.message_input_field'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "logging_init_.py", line 1079, in emit
File "logging_init_.py", line 923, in format
File "kivy\logger.py", line 291, in format
File "copy.py", line 172, in deepcopy
File "copy.py", line 270, in _reconstruct
File "copy.py", line 146, in deepcopy
File "copy.py", line 230, in _deepcopy_dict
File "copy.py", line 146, in deepcopy
File "copy.py", line 210, in _deepcopy_tuple
File "copy.py", line 210, in <listcomp>
File "copy.py", line 161, in deepcopy
TypeError: cannot pickle 'traceback' object
Call stack:
File "main.py", line 15, in <module>
File "<frozen importlib._bootstrap>", line 1007, in find_and_load
File "<frozen importlib._bootstrap>", line 986, in find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 680, in load_unlocked
File "PyInstaller\loader\pyimod02_importers.py", line 352, in exec_module
File "screens\common.py", line 9, in <module>
File "<frozen importlib._bootstrap>", line 1007, in find_and_load
File "<frozen importlib._bootstrap>", line 986, in find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 680, in load_unlocked
File "PyInstaller\loader\pyimod02_importers.py", line 352, in exec_module
File "ui\talkroom.py", line 288, in <module>
File "ui\talkroom.py", line 289, in TalkRoomScreen
File "kivy\lang\builder.py", line 372, in load_string
File "kivy\lang\parser.py", line 483, in init
File "kivy\lang\parser.py", line 590, in parse
File "kivy\lang\parser.py", line 564, in execute_directives
File "logging_init
.py", line 1469, in exception
File "logging_init
.py", line 1463, in error
File "logging_init
.py", line 1577, in log
File "logging_init
.py", line 1587, in handle
File "logging_init
.py", line 1649, in callHandlers
File "logging_init
.py", line 948, in handle
File "logging_init
.py", line 1087, in emit
Message: ''
Arguments: ()
Traceback (most recent call last):
File "kivy\lang\parser.py", line 553, in execute_directives
File "<frozen importlib._bootstrap>", line 1109, in import
File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
File "<frozen importlib._bootstrap>", line 972, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 228, in _call_with_frames_removed
File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
File "<frozen importlib._bootstrap>", line 984, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'src.ui.components.message_input_field'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "kivy\lang\parser.py", line 556, in execute_directives
File "<frozen importlib._bootstrap>", line 1109, in import
File "<frozen importlib._bootstrap>", line 1030, in _gcd_import
File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
File "<frozen importlib._bootstrap>", line 984, in _find_and_load_unlocked
ModuleNotFoundError: No module named 'src.ui.components.message_input_field'

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
File "main.py", line 15, in <module>
File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
File "PyInstaller\loader\pyimod02_importers.py", line 352, in exec_module
File "screens\common.py", line 9, in <module>
File "<frozen importlib._bootstrap>", line 1007, in _find_and_load
File "<frozen importlib._bootstrap>", line 986, in _find_and_load_unlocked
File "<frozen importlib._bootstrap>", line 680, in _load_unlocked
File "PyInstaller\loader\pyimod02_importers.py", line 352, in exec_module
File "ui\talkroom.py", line 288, in <module>
File "ui\talkroom.py", line 289, in TalkRoomScreen
File "kivy\lang\builder.py", line 372, in load_string
File "kivy\lang\parser.py", line 483, in init
File "kivy\lang\parser.py", line 590, in parse
File "kivy\lang\parser.py", line 565, in execute_directives
kivy.lang.parser.ParserException: Parser: File "<inline>", line 2:
...
1:

2:#:import MessageTextField src.ui.components.message_input_field.MessageTextField

3:<TalkRoomScreen>: 4: #画面全体のレイアウト

...
Unable to import package 'src.ui.components.message_input_field.MessageTextField'
[60336] Failed to execute script 'main' due to unhandled exception!

該当のソースコード

KV言語内のimportでエラーが発生しているようです。

(中略)

'# TalkItemで使用
from kivy.core.clipboard import Clipboard

KV = '''
#:import MessageTextField src.ui.components.message_input_field.MessageTextField
<TalkRoomScreen>:
#画面全体のレイアウト
MDBoxLayout:
orientation: "vertical"
'
'#画面上部の話し相手の名前
MDBoxLayout:
orientation: "horizontal"
size_hint_y: None
height: 30

試したこと

下記、wat.specに必要そうな記載を一通り行ってみました。
'# -- mode: python ; coding: utf-8 --
block_cipher = None
a = Analysis(
['main.py'],
pathex=['D:/GitHub/wat', 'D:/GitHub/wat/src', 'D:/GitHub/wat/src/ui/components'],
binaries=[],
datas=[],
hiddenimports=['kivymd.icon_definitions', 'src.process', 'src.ui', 'src.ui.components', 'src.screens'],
hookspath=[],
hooksconfig={},
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='wat',
debug=False,
bootloader_ignore_signals=False,
strip=False,
upx=True,
upx_exclude=[],
runtime_tmpdir=None,
console=True,
disable_windowed_traceback=False,
argv_emulation=False,
target_arch=None,
codesign_identity=None,
entitlements_file=None,
)

補足情報(FW/ツールのバージョンなど)

実際のフォルダ構成は下記の様になっています。
main.pyを起動して、talkroom.pyを呼び出し、message_input_field.pyをインポートしようとしています。

D:/GitHub/wat
├── pyproject.toml
├── src
| └── ui
| ├── components
| | ├── init.py
| | └── message_input_field.py
| ├── init.py
| ├── namelist.py
| └── talkroom.py
├────── main.py
└────── settings.py

よろしくお願いいたします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

I really like reading what you've written. Play football legends for fun every day

投稿2023/04/21 04:20

fondemi

総合スコア20

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

自己解決

自己解決しました。
python上にKV言語でインポートしようとしているクラスのimport文を追記して少々強引ですが、モジュールを認識させることができました。

from src.ui.components.message_input_field import MessageTextField #追記 KV = ''' #:import MessageTextField src.ui.components.message_input_field.MessageTextField <TalkRoomScreen>: #画面全体のレイアウト

もっといいやり方がありそうですが、今回はこちらのやり方で行こうと思います。
読み返してみるとなかなかの駄文による質問でお目汚し失礼いたしました…。

投稿2023/04/09 11:34

AnoGame

総合スコア1

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.37%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問