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

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

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

Microsoft Windows 7は過去にリリースされたMicrosoft WindowsのOSであり、Windows8の1代前です。2009年の7月にリリースされ販売されました。Windows7の前はWindowsVistaで、その更に3年前にリリースされました。

Python 3.x

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

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Python

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

Q&A

1回答

7947閲覧

Windowsのシャットダウンによる強制終了でも適切に終了処理を行う方法

fukatataku

総合スコア16

Windows 7

Microsoft Windows 7は過去にリリースされたMicrosoft WindowsのOSであり、Windows8の1代前です。2009年の7月にリリースされ販売されました。Windows7の前はWindowsVistaで、その更に3年前にリリースされました。

Python 3.x

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

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Python

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

0グッド

2クリップ

投稿2014/09/25 11:17

pythonスクリプトが強制終了された場合でも、終了処理を適切に実施する方法は無いでしょうか?
try ~ finally節はキーボードインタラプトなどは対応できますが、コンソールウィンドウの×ボタンを
押したり、Windows自体をシャットダウン/再起動した場合は対応できないようです。

lang

1try: 2 while True: 3 time.sleep(1) 4finally: 5 # 終了したらファイルにメッセージを出力する 6 with open("hoge.txt", 'w') as f: 7 f.write("終了しました¥n")

上記のようなコードを実行した場合Ctrl-Cに対しては意図した通りに動作しますが、
コンソールウィンドウの×ボタンによる終了や、Windowsをシャットダウンした場合は
何も出力されません。

Windowsをシャットダウンしても適切に終了処理をする良い方法はないでしょうか?

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

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

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

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

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

guest

回答1

0

コンソールアプリケーションであれば、SetConsoleCtrlHandler win32apiを利用して以下のようなコードを書く事ができると思います。

lang

1# -*- coding: utf-8 -*- 2import win32api 3import win32con 4import time 5 6def ctrl_handler(evt): 7 if(evt in (win32con.CTRL_C_EVENT, 8 win32con.CTRL_BREAK_EVENT)): 9 with open("hoge.txt", 'w') as f: 10 f.write("C-c,C-break ¥n") 11 if(evt in (win32con.CTRL_CLOSE_EVENT, 12 win32con.CTRL_LOGOFF_EVENT, 13 win32con.CTRL_SHUTDOWN_EVENT)): 14 with open("hoge.txt", 'w') as f: 15 f.write("Close | Log off | Shutdown ¥n") 16 17 # return True 18 return False 19 20if __name__ == '__main__': 21 win32api.SetConsoleCtrlHandler(ctrl_handler) 22 try: 23 while True: 24 time.sleep(1) 25 finally: 26 with open("hoge.txt", 'w') as f: 27 f.write("Exit. ¥n")

投稿2014/09/25 23:34

flied_onion

総合スコア2604

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

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

fukatataku

2014/09/26 15:29

回答ありがとうございます。 win32apiを使う方法が最も良さそうですね。 ただ、試してみたところ×ボタン押下に対しては終了処理をしてくれましたが、 Windowsのシャットダウン/再起動では何故かうまくいきませんでした。 もう少し試行錯誤をしてみようかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問