🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Python

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

Q&A

解決済

1回答

4425閲覧

Python: watchdogでのフォルダ監視、『検知して やることやったら 自分の起動を終わらせたい』

saya24

総合スコア246

Python

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

0グッド

0クリップ

投稿2021/02/11 09:20

こちらの記事を参考に フォルダ監視を行おうとしています。

本日まるっとコピペして 記事に紹介されている動きはできたのですが、やることをやったら(例えば監視されたフォルダに新たにファイルが加わったら別フォルダへ退避)、当該アプリケーションの実行自体を終える ことを達成したいです。

質問

どういう記述を追加すれば 自身の実行を終わらせることができるでしょうか。 以下の例ではprint文のあとに実行を終えることを意味します。

python

1from watchdog.events import FileSystemEventHandler 2from watchdog.observers import Observer 3 4import os 5import time 6 7#監視したいフォルダのパス 8target_dir = "D:\TEST" 9 10 11class ChangeHandler(FileSystemEventHandler): 12 def on_created(self, event): 13 filepath = event.src_path 14 filename = os.path.basename(filepath) 15 print('%sができました' % filename) 16 17 # sys.sys.exit(0) ---> タスクマネージャでみたら 相変わらず 動いていたので効いていない様子 18 19 20if __name__ in '__main__': 21 while 1: 22 event_handler = ChangeHandler() 23 observer = Observer() 24 observer.schedule(event_handler, target_dir, recursive=True) 25 observer.start() 26 try: 27 while True: 28 time.sleep(0.1) 29 except KeyboardInterrupt: 30 observer.stop() 31 observer.join()

自分で試したこと

sys.exit(0)を 入れてみましたが タスクマネージャで確認すると 相変わらず うごきっぱなしの状況が確認できました。
タスクマネージャで 確認している理由は exe化する際に --noconsoleのオプションを与えているからです。
(サーバでの運用想定で 当該アプリは 前もってexe化が必要となります)
実際は 検知時に print文を実行するのではなく ファイルのコピー退避を検討しています。
何卒よろしくお願い申し上げます。

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

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

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

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

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

guest

回答1

0

ベストアンサー

watchdogの上記の使い方では、while 1で無限ループを作る必要はありません。

あと、sys.exit(0)は少々乱暴です。
self.observer.unschedule_all()でスケジュールを解放してから、
self.observer.stop()を使って停止してください。

あと、「if __name__ in '__main__':」という書き方は初めて見ました。動作上は間違いではありませんが、 ==が普通だと思います。

diff

1(略) 2 3 4class ChangeHandler(FileSystemEventHandler): 5+ def __init__(self, observer): 6+ self.observer = observer 7 8 def on_created(self, event): 9 filepath = event.src_path 10 filename = os.path.basename(filepath) 11 print('%sができました' % filename) 12+ self.observer.unschedule_all() 13+ self.observer.stop() 14 15(略) 16 17if __name__ == '__main__': 18-while 1: # 削除 以降は見やすくするために当初コードからインデントを1段階解除している 19 observer = Observer() 20+ event_handler = ChangeHandler(observer) 21 observer.schedule(event_handler, target_dir, recursive=True) 22 observer.start() 23 try: 24- while True: # 削除 25+ while observer.is_alive(): 26 time.sleep(0.1) 27 except KeyboardInterrupt: 28+ observer.unschedule_all() 29 observer.stop() 30 observer.join()

投稿2021/02/11 10:42

編集2021/02/11 10:45
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

saya24

2021/02/11 11:48

qnoirさん 今しがた 試させて頂きました。ばっちりです! まだ よく理解できていないので理解に努めます、まずはお礼まで
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問