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

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

新規登録して質問してみよう
ただいま回答率
85.35%
Python 3.x

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

Python

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

Q&A

0回答

1146閲覧

処理の途中で落ちてしまう原因について

MountDown

総合スコア9

Python 3.x

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

Python

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

0グッド

0クリップ

投稿2021/01/19 02:27

編集2021/01/19 15:00

ボタンを押下してファイルチェックの処理を走らせて、条件を満たしたところでブラウザを開く処理を開始したいのですが、以下のコードを実行するとなぜかブラウザが途中で落ちてしまいます。
(おそらくbreakになったところで落としている?)
無駄にループを回さないほうが良いかと思い、breakしているのですがこのような書き方は間違っているのでしょうか?

#サーバへ接続 conn = SMBConnection( '<ユーザー名>', '<パスワード>', platform.uname().node, '<サーバ名>') conn.connect('<IPアドレス>', 139) #ファイルを生成 ・ ・(パス、ファイル名割愛) ・ sender_path = os.path.join(svrpath, file_name) chk_path1 = os.path.join(svrpath_s, file_name_s) chk_path2 = os.path.join(svrpath_f, file_name_f) #print(sender_path) open(sender_path,'w') # clickイベント def btn_click3(): root = tkinter.Tk() root.title('このウインドウは自動的に閉じます') root.geometry("350x40") #ラベル Static1 = tkinter.Label(text=u'処理完了後に自動的にブラウザが立ち上がります。') Static1.pack() #5秒後にウインドウを閉じる root.after(3000, lambda: root.destroy()) root.mainloop() num = 0 bool1 = True while( not( os.path.isfile(chk_path1))): time.sleep(1) num += 1 bool1 = True print(num) if num < 120 and os.path.isfile(chk_path1): os.remove(chk_path1) bool1 = True break elif num == 120 and os.path.isfile(chk_path2): os.remove(chk_path2) bool1 = False break elif num > 120: bool1 = False break if bool1 == True: print(bool1) open_edge() else: print(bool1) sorry_message() def open_edge(): browser = webdriver.Edge(r"C:\edgedriver_win64\msedgedriver.exe") browser.get('https://www.yahoo.co.jp') def sorry_message(): root = tkinter.Tk() root.title('テスト') root.geometry("350x40") #ラベル Static1 = tkinter.Label(text=u'失敗') Static1.pack() #5秒後にウインドウを閉じる root.after(5000, lambda: root.destroy()) root.mainloop() #ファイルの存在チェック is_file = os.path.isfile(sender_path) if is_file: print(f"{sender_path} is a file.") else: #pass # パスが存在しないかファイルではない print(f"{sender_path2} is a file.") print(conn.echo('echo success')) conn.close()

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

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

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

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

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

YT0014

2021/01/19 05:02

btn_click3()の仕様をご提示ください。 また、btn_click3()の最後の if bool1 == True 以下の処理は、while内部の処理になっているように見えますが、正しいのでしょうか?
MountDown

2021/01/19 05:27

ありがとうございます。 ファイルチェックのプログラムです。 1.120秒以内に目的のファイルが生成出来たらファイルを消してブラウザを開く 2.120秒経過して失敗時用のファイルが出来ていたらファイルを消して失敗メッセージを表示 3.120秒経過して何もファイルが出来なかったら失敗メッセージを表示 whileの外にしたいのですが、インデントがおかしいと表示されまして・・・今の形になっています。
YT0014

2021/01/19 05:41 編集

まずは、while の外に出す必要があるかと。 現状では、毎秒、open_edgt() が呼ばれますし、逆に、呼ぶべきタイミングで open_edgt() が呼ばれません。 bool1 = True を、while の上にも記述したら、「インデントが~」が消えませんか?
MountDown

2021/01/19 05:59

num = 0 bool1 = True while( not( os.path.isfile(chk_path1))): time.sleep(1) num += 1 bool1 = True print(num) if num < 120 and os.path.isfile(chk_path1): os.remove(chk_path1) bool1 = True break elif num == 120 and os.path.isfile(chk_path2): os.remove(chk_path2) bool1 = False break elif num > 120: bool1 = False break if bool1 == True: print(bool1) open_edge() else: print(bool1) sorry_message() def open_edge():
MountDown

2021/01/19 06:02

修正依頼に書いたらインデントが消えてしまいましたが・・・ ご教示いただいた通り、bool1 = Trueの位置をwhileの上に追記およびif bool1 == True:を1タブ分左にずらしました。 それでインデントのエラーは無いのですが、ブラウザが落ちる症状は変わりませんでした。。。
YT0014

2021/01/19 06:08

質問は修正できますので、コードに関しては、質問の修正をお願いします。 落ちるタイミングを正確に確認してください。 キー待ちなり、デバッグなり、Dialogなりを使って、落ちる位置を割り出してください。
MountDown

2021/01/19 15:03

ひとつひとつ実行をしてデバッグをしてみたところ、conn.close()をした瞬間にブラウザが落ちました。 プログラムの実行は終了してもブラウザは表示させたままにしたいのですが・・・ どのように対処したらよいのか理解が出来ておりません。。。
YT0014

2021/01/20 05:22

実行終了しても表示したいとなると、考え方から変えないとできません。 現状のやり方を基にするなら、ブラウザが閉じられるまで、このプログラムが裏に隠れている状態にするくらいでしょうか。
YT0014

2021/01/20 05:50

https://pcl.solima.net/pyblog/archives/468 これを参考にして、open_edge()をdaemon = Falseで呼べば、実現できる可能性があります。子プロセスの実行が禁止されるので、webdriver.Edge()でエラーが出そうな気もしますが。
MountDown

2021/01/21 05:01

browser = webdriver.Edge(r"C:\edgedriver_win64\msedgedriver.exe") browser.get('https://www.yahoo.co.jp') root2 = tkinter.Tk() root2.title('ブラウザ起動中') root2.geometry("350x35") #ラベル Static2 = tkinter.Label(text=u'閉じる') Static2.pack() root2.after(5000, lambda: root.destroy()) root2.mainloop() 正しいのか分かっていないのですが、このようにすることで逃げる(??)ことが出来たので対応してみました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問