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

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

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

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

PyInstaller

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

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Python

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

Q&A

解決済

3回答

3528閲覧

pyinstallerで作成したappファイルが動作しないで終了する

pinsan

総合スコア3

Anaconda

Anacondaは、Python本体とPythonで利用されるライブラリを一括でインストールできるパッケージです。環境構築が容易になるため、Python開発者間ではよく利用されており、商用目的としても利用できます。

PyInstaller

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

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

MacOS(OSX)

MacOSとは、Appleの開発していたGUI(グラフィカルユーザーインターフェース)を採用したオペレーションシステム(OS)です。Macintoshと共に、市場に出てGUIの普及に大きく貢献しました。

Python

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

0グッド

0クリップ

投稿2020/08/11 03:04

編集2020/08/11 15:05

前提・実現したいこと

【環境】
macOS High Sierra 10.13
Python3.6.10
IDE->Visual Studio code

Tkinterを使って簡単なGUIアプリを作成し、
pyinstallerでアプリケーション化したいと思っています。

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

そもそもエラーメッセージすら出ずに起動中のアニメーションの後にすぐ終了してしまいます。 同時にできるExecファイルは問題なく実行できます。

該当のソースコード

python

1# 所々元のコードから"テキスト"や"URL"に変更してあります。 2from tkinter import * 3import tkinter as tk 4from tkinter import messagebox as mbox 5# web automation 6from selenium import webdriver 7from selenium.webdriver.support.ui import Select 8import datetime 9import time 10import numpy as np 11from getpass import getpass 12import os 13# import sys 14 15 16def main(): 17 18 # 再起数上限の変更 19 # sys.setrecursionlimit(20000) 20 21 # ウィンドウを作成 22 win = tk.Tk() 23 win.title("テキスト") 24 win.resizable(False, False) 25 frame1 = tk.Frame(win) 26 frame1.grid() 27 28 # ユーザー名 29 # ラベルを作成 30 label_user = tk.Label(frame1, text='Username') 31 label_user.grid(row=0, column=0, sticky=E) 32 33 # テキストボックスを作成 34 text_user = StringVar() 35 username_entry = tk.Entry( 36 frame1, 37 textvariable = text_user, 38 width=20) 39 username_entry.grid(row=0, column=1) 40 41 # パスワード 42 # ラベルを作成 43 label_pass = tk.Label(frame1, text='Password') 44 label_pass.grid(row=1, column=0, sticky=E) 45 46 # テキストボックスを作成 47 text_pass = StringVar() 48 password_entry = tk.Entry( 49 frame1, 50 textvariable = text_pass, 51 width=20, 52 show='*') 53 password_entry.grid(row=1, column=1) 54 55 # 56 # ラベルを作成 57 label_BT = tk.Label(frame1, text='BT') 58 label_BT.grid(row=2, column=0, sticky=E) 59 60 # テキストボックスを作成 61 text_BT = StringVar() 62 temp_entry = tk.Entry( 63 frame1, 64 textvariable = text_BT, 65 width=20) 66 temp_entry.grid(row=2, column=1) 67 68 def ok_click(): 69 # テキストボックスの内容を得る 70 username = text_user.get() 71 password = text_pass.get() 72 BT = text_BT.get() 73 74 # 75 web_automation(username, password, BT) 76 77 # ウィンドウを閉じる 78 win.quit() 79 80 # ダイアログを表示 81 mbox.showinfo('完了しました!') 82 83 # ボタンを作成 84 frame2 = tk.Frame(frame1) 85 frame2.grid(row=3, column=1, sticky=W) 86 87 okButton = tk.Button( 88 frame2, text='OK', command=ok_click) 89 okButton.pack(side=LEFT) 90 91 def quit(): 92 # ウィンドウを閉じる 93 win.quit() 94 95 quitButton = tk.Button(frame2, text='Cancel', command=quit) 96 quitButton.pack(side=LEFT) 97 98 # ウィンドウを開く 99 win.mainloop() 100 101 102def web_automation(username, password, BT): 103 104 # 日時 105 today = datetime.date.today() 106 time_zone = np.random.randint(6,8) 107 108 # BT matrix 109 body_temp = {} 110 for i in range(42): 111 body_temp[str(round(35.9+i/10,1))] = i+1 112 113 if float(BT)>40.0: 114 BT_value = 42 115 elif float(BT)<35.9: 116 BT_value = 1 117 else: 118 BT_value = body_temp[BT] 119 120 # Configuration 121 CONFIG = { 122 'username': username, 123 'password': password, 124 'BT': BT_value, 125 } 126 127 # ブラウザを開く 128 driver_dir = os.getcwd() 129 driver_path = os.path.join(driver_dir,'chromedriver') 130 driver = webdriver.Chrome(driver_path) 131 driver.get("URL") 132 133 # ユーザー名を入力 134 driver.find_element_by_name("username").send_keys(CONFIG['username']) 135 136 # パスワードを入力 137 driver.find_element_by_name("val").send_keys(CONFIG['password']) 138 139 # ログインボタンをクリック 140 driver.find_element_by_id("LoginBtn").click() 141 142 # 143 driver.find_element_by_xpath('//*[@id="%s"]/li[3]/div/div[1]/a').click() 144 145 # 146 time.sleep(1) 147 driver.find_element_by_link_text("テキスト").click() 148 149 # 3秒待機 150 time.sleep(1) 151 152 # 開始 153 iframe = driver.find_elements_by_xpath("//frame")[1] 154 driver.switch_to_frame(iframe) 155 driver.find_element_by_xpath('//*[@id="PageBody"]/table/tbody/tr/td[2]/form/table[2]/tbody/tr/td/input[1]').click() 156 157 # フレームを移動 158 iframe = driver.find_element_by_xpath("/html/frameset/frameset/frame[2]") 159 driver.switch_to_frame(iframe) 160 161 # XPath 162 question_path = { 163 1:'/html/body/form/div[1]/div/div/table/tbody/tr/td/table/tbody/tr/td/select', 164 2:'/html/body/form/div[2]/div/div/table/tbody/tr/td/table/tbody/tr/td/select', 165 3:'/html/body/form/div[3]/div/div/table/tbody/tr/td/table/tbody/tr/td/select', 166 4:'/html/body/form/div[4]/div/div/table/tbody/tr/td/table/tbody/tr/td/select', 167 5:'/html/body/form/div[5]/div/div/table/tbody/tr/td/fieldset/table/tbody/tr[1]/td[2]/label', 168 6:'/html/body/form/div[6]/div/div/table/tbody/tr/td/fieldset/table/tbody/tr[1]/td[2]/label', 169 7:'/html/body/form/div[7]/div/div/table/tbody/tr/td/fieldset/table/tbody/tr[1]/td[2]/label', 170 8:'/html/body/form/div[8]/div/div/table/tbody/tr/td/fieldset/table/tbody/tr[1]/td[2]/label', 171 } 172 173 # 設問 174 for i,path in question_path.items(): 175 dropdown = driver.find_element_by_xpath(path) 176 if i == 1: 177 Select(dropdown).select_by_value(str(today.month)) 178 elif i == 2: 179 Select(dropdown).select_by_value(str(today.day)) 180 elif i == 3: 181 Select(dropdown).select_by_value(str(time_zone)) 182 elif i == 4: 183 Select(dropdown).select_by_value(str(CONFIG['BT'])) 184 else: 185 dropdown.click() 186 187 # 3秒待機 188 time.sleep(1) 189 190 # 回答を終了 191 driver.find_element_by_xpath('//*[@id="GradeBtn"]').click() 192 193 # 3秒待機 194 time.sleep(3) 195 196 # 終了 197 driver.switch_to_default_content() 198 iframe = driver.find_element_by_xpath("/html/frameset/frameset/frame[2]") 199 driver.switch_to_frame(iframe) 200 driver.find_element_by_xpath('//*[@id="ContentInfo"]/tbody/tr[2]/td/input').click() 201 202 # ブラウザを閉じる 203 driver.close() 204 205if __name__ == '__main__': 206 main() 207

試したこと

最初Execファイルもエラーで実行できなかったのですが、こちらの記事を参考にして再度pyinstallerからアプリを作ったところ、Execファイルだけは実行可能になりました。

py2app、cx_Freezeも試してみましたが、py2appは最大再起数を超えているというエラー(この記事を参考に追記してもダメでした)、cx_Freezeでは、

File "/Users/ユーザー名/opt/anaconda3/lib/python3.6/posixpath.py",

line 156, in dirname
p = os.fspath(p)
TypeError: expected str, bytes or os.PathLike object, not NoneType

というエラーが出てどちらもアプリケーション化出来ませんでした。
まだ始めたばかりで不十分な点が多いと思うのですが、教えていただければ幸いです。

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

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

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

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

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

guest

回答3

0

.appファイル作成について追記

直接的な解決法ではなく二度手間にはなってしまいますが、こちらの記事を参考にAppleScriptを使って、実行可能な.appファイルを作成することが出来ました。

最後コピーをするときに.appはでディレクトリなので"cp -r"とすることに注意して下さい。

投稿2020/08/12 02:31

pinsan

総合スコア3

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

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

0

ベストアンサー

エラーがないと原因の特定は難しいので、

端末への出力関連のオプションがあるので、
appファイル起動時もエラーログが端末に出るように設定ファイルを構成しましょう。

specファイル内でも設定できるはずですが、
編集済みのspecファイルは、一旦どこかへバックアップを取っておき。
余分なオプション無しでpyinstaller コマンドを試してください。

--no-console オプション等を付けなければ、エラーが出力されたはずです。

まずは、エラーを表示させるように設定を構成するのが第一歩。
(これは問題を探すデバッグ中のみの設定で、リリース時には設定をオフにします)

出来れば、どんなコマンドのオプション/specファイルでpyinstaller を使ったのか、
実際のものを提示お願いします。オプション一つ違うだけで必要な対応が違ってくる事もあります。


次に、目的のコードではなく、簡単なウィンドウを出すだけのコードで動作確認。

import tkinter as tk # import numpy # import selenium win = tk.Tk() win.mainloop()

numpy や selenium 等の外部ライブラリの利用は、追加の設定が必要なことも有るので
ひとつづつ追加していき、簡単なコードで動作を確認します。

この辺は、実際にやったことないので、試してみてください。
問題点の切り分けが目的です。自分の書いたコードの問題なのか、ライブラリ等の環境構築の問題か、
両方の問題で、実行ファイル化に伴い対応が必要な場合もあります。


コードを見た感じで気になる点は、driver_path ですが
app化した時も path は正しく取れているでしょうか?

投稿2020/08/11 04:51

編集2020/08/11 05:01
teamikl

総合スコア8664

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

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

pinsan

2020/08/11 14:59

回答ありがとうございます。 教えていただいた簡単なコードで動作確認したところ、 ①pyinstaller ~.py --onefile   ⇒ execファイル生成&.appファイルは生成されない    import numpyでエラーが出るがspecファイルを書き換えると正常に動作 ②pyinstaller ~.py --onefile --noconsole  ⇒ execファイル&.appファイル生成、execは上同様specファイルを書き換えると動くが、    .appファイルは一瞬起動した後にすぐ終了でGUIウィンドウが出ない。    (エラーではないかもしれません。これはtikinterのみの場合でも同じでした)    .appファイルはターミナルのopenから実行してもエラーが表示されませんでした。    pyinstaller ~.spec --onefileで.appを更新してもエラーは出ずに同じ挙動でした。 以下がpyinstaller ~.py --onefile --noconsole実行時のspecファイルです。 ******************************************************************************************************* # -*- mode: python ; coding: utf-8 -*- block_cipher = None a = Analysis(['pyinstaller_test.py'], pathex=['/Users/ユーザー名/Desktop/python'], binaries=[], datas=[], hiddenimports=['pkg_resources.py2_warn'], #import numpyでのエラー防止 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='pyinstaller_test', debug=True, # Falseから変えても変わりませんでした bootloader_ignore_signals=False, strip=False, upx=True, upx_exclude=[], runtime_tmpdir=None, console=False ) app = BUNDLE(exe, name='pyinstaller_test.app', icon=None, bundle_identifier=None) ******************************************************************************************************* ③driver_pathはexecファイルでは正しく取れているようでした。  .appファイルは起動しないので確かめられていません。 以上から考えるとライブラリ等の環境構築の問題なのでしょうか?
teamikl

2020/08/11 16:45

--noconsole を付けなかった時、.app ファイルが生成されないのは正しい挙動です。 デバッグで問題があった時に、端末へエラーログが出力されるのを期待しての設定だったので、 ここでは、 >driver_pathはexecファイルでは正しく取れているようでした。 が確認出来れば大丈夫です。 ---- 環境問題の場合は、pyinstaler のバージョン情報や、 場合によっては何処からどのようにインストールしたか等の情報も必要です。 github の issue tracker を検索すると osx + tkinter の問題はいくつかあるみたいで --onefile オプションでは、コードやリソース群を一時フォルダに展開し実行するのですが、 最近の osx ではセキュリティ制限にひっかかるので推奨されない様です。 MacOS -noconsole resulting app wont launch #4804 https://github.com/pyinstaller/pyinstaller/issues/4804 pyinstaller で報告されてる問題の検索結果一覧 https://github.com/pyinstaller/pyinstaller/issues?q=is%3Aissue+is%3Aopen+osx+tkinter もしバージョンが古い場合は、Open だけではなく、Close されたものも検索して見て下さい。
pinsan

2020/08/12 01:07

まず--onefileオプションを付けずに試してみたのですが.appの挙動は変わりませんでした。 バージョンは、 PyInstaller 3.6(pip install) Python 3.6.10 :: Anaconda, Inc. で教えていただいたissue#4804でも同じバージョンで問題が起きている人がいるようなので、 Tkintetrの代わりにPyside2/Qtを試してみようかと思います。 教えていただきありがとうございました。
guest

0

エラー原因として考えられること

1,構成ファイルの破損
解決策 pyinstaller xxx.py --onefileという感じで--onefileを付けることで、一つのファイルに圧縮されます。
2,ファイル自体のエラー
IDLEなどで、ファイル自体を実行してもエラーが出るのでしょうか?
3,ごっちゃになりすぎた、
一回ディレクトリを変えて--onefileオプションを付けて実行してみてください。

投稿2020/08/11 05:44

Hyugopython

総合スコア148

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

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

pinsan

2020/08/11 15:03

回答ありがとうございます。 下の回答の返信でも書かせていただきましたが、--onfileオプションを試してみましたがダメでした。 IDLEでファイル自体というのは~.py自体ということでしょうか? VScodeで~.pyは問題なく動作し、ターミナルで.appファイルを実行しようとしたところ、 一瞬実行が開始されそうな間があった後にカレントディレクトリに戻るというような挙動を示しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問