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

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

詳細はこちら
Python

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

Q&A

解決済

1回答

1921閲覧

Python: フォルダ監視(watchdog=新たなファイルの存在察知から)動作するイベントを もう少しあとにしたい。

saya24

総合スコア246

Python

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

1グッド

0クリップ

投稿2021/03/04 16:04

編集2021/03/04 16:50

社内からクラウドのシステムにデータを送信すると、当該データの元フォルダに、処理結果を知らせるファイルが届く運用環境が整っています。
そこで、処理結果のファイルが到着したら、同フォルダ内の送信データおよび結果ファイルを別フォルダへ退避、また処理結果ファイルをメール送信する仕組みを作りました。以下抜粋です。

python

1from watchdog.events import FileSystemEventHandler 2from watchdog.observers import Observer 3import os 4import time 5''' 6###################################################################################################### 7# 8# # 9###################################################################################################### 10''' 11class ChangeHandler(FileSystemEventHandler): 12 def __init__(self, observer): 13 self.observer = observer 14 15 def on_created(self, event): 16 filepath = event.src_path 17 filename = os.path.basename(filepath) 18 foldername = os.path.basename(os.path.dirname(filepath)) 19 20 result = mail.send_Mail(arges[1], arges[2], arges[3], foldername, arges[4] + '/' + filename) 21 backup.move_files(arges[4], arges[5]) 22 23 24 self.observer.unschedule_all() 25 self.observer.stop() 26 27if __name__ in '__main__': 28 mail = Email() 29 backup = BackUp() 30 31 observer = Observer() 32 event_handler = ChangeHandler(observer) 33 observer.schedule(event_handler, target_dir, recursive=True) 34 observer.start() 35 try: 36 while observer.is_alive(): 37 time.sleep(0.1) 38 except KeyboardInterrupt: 39 observer.unschedule_all() 40 observer.stop() 41 observer.join()

問題点と質問

クラウドのシステムから届く結果ファイルが 完全に送信処理が終わる前に届いているようで、イベント発火が期待以上に速いことに困っています。
・メールに添付された結果ファイルは空の状態であるも フォルダ上の当該結果ファイルを後から確認すると空ではない
・本来送信したファイルも退避されるはずだが、イベント発火時にまだ送信中=INUSEになっているためか 退避されていない
問題が生じています。

on createdの関数の頭部分で ある程度の秒数time.sleep(XXX)をすればよいのかな、と対応してみたのですが 状況変わらずでした。どういう対策をとるのが得策か どなたかご教示を頂けないでしょうか

なお、上記Pythonの自作アプリケーションは 送信データの作成・配置用途のAサーバからの起動であり、
クラウド向け送信処理(バットファイル)は フリーのフォルダ監視ソフトによるり自身=Bサーバからの起動になっています。Aサーバがデータの配置を終えることを Bサーバ側で察知という感じです。

YouheiSakurai👍を押しています

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2021/03/04 23:31 編集

クラウドストレージに送信中のファイルを、上記pythonコード内で別フォルダに退避(移動)させようとした場合、何も例外は発生しないのでしょうか? (上記質問文中の「INUSE」というのは、クラウドへ送信するソフト側でのエラーメッセージのことなのでしょうか?) あと、メール送信関数に渡しているargesの中身は、結果ファイルの中身から取得しているのでしょうか?
saya24

2021/03/04 23:40 編集

確認をありがとうございます。使用中状態を理由に退避コピーが行えていないのではないか、というのは自分の推察でしかないです。 とにかくいつ結果ファイルが得られるのか分からないので、検知用に今回のアプリを作ってみたのですが。 現在ファイル作成側のAサーバ側でファイルを配置後にこのアプリを起動しています。 Bサーバ側の、データの送信処理バットファイル内で このアプリを起動するべきかな、考え出しています。 このアプリの引数は、Aサーバ側での起動時に与えています。メール宛先 CC BCC 監視フォルダ 退避先フォルダ です。
saya24

2021/03/05 03:42 編集

ファイルをクラウド環境に送信するバットファイル内で、最初にこのPythonのプログラムをSTARTして、送信処理を起動するようにしても 状況はおなじでした。 クラウド環境から送られてくるのではなく、手元でまず カラの結果ファイルが作成され、そちらに データ送信処理の結果が記録されていく作りみたいです。 Pythonのこのプログラムで 時間差をつけて メール配信・ファイル退避する方式では 送信ファイルの容量次第で カラぶりそうです。察知した新規ファイルがINUSEかINUSEじゃないかっって 捉えられますかねぇ
saya24

2021/03/05 04:02

Pythonのプログラムを単純に メール添付と退避処理する作りに変えて、送信処理のバットファイル最後に 当該を起動するようにすれば良いだけ、のような気がしてきました。。。。。。
退会済みユーザー

退会済みユーザー

2021/03/05 06:37 編集

>察知した新規ファイルがINUSEかINUSEじゃないかっって 捉えられますかねぇ 処理対象と処理の内容を、結果ファイルに対するものと、移動(退避)すべき元ファイルに対するもの、の2つに分けて考えないといけないかもしれませんね。 (どっちも同時にやろうとするのではなく) まず、仮に、結果ファイルの内容が「空の結果ファイル作成後、徐々に追加されていく」という方式ならば、結果ファイルが新規作成されたことを検知した後で、その結果ファイルの内容を定期的に読み取り、追加された内容=送信完了となったファイルを順次退避処理にかけていく、というイメージになるでしょうか。 ただ、退避対象となる元ファイルについては、ご推察の通り、ファイルサイズが大きい場合、結果ファイル上は送信完了として記録されていても移動に失敗するケースもありそうです。 これについてはやってみないとわかりませんが、元ファイルが送信処理中ならば、その元ファイルを(コピーではなく)退避用のフォルダに移動させようとした時点で、何らかの例外が発生するのではないかと思います。 (よって、ファイル移動処理の部分をtry exceptで囲んでおいて、移動時に例外が発生した場合は、適当な時間待ってリトライする、という考え方)
saya24

2021/03/05 09:10

送信処理のバットファイル最後に、メール報告と退避目的の 今回作ったexeを実行するようにして バットファイルを実行したら.....なんとこのexeを実行する前に 自身のバットファイルを閉じてしまう作りになっているみたいです。何回このバットファイルを実行しても exeの結果を得られず、バットファイルが閉じるので exe起動前にpauseいれたのに 停止せず 閉じた!!! 困ったなぁ...本当にINUSEかそうじゃないか判断する作りのプログラムを やはり送信処理の前に実行させるようにしないといけない....
saya24

2021/03/05 10:13

送信データファイルの移動できるかできないかで判断、ちょっとやってみます。 結果ファイルの存在でこのプログラムを起動させるようにフリーの監視ソフトを仕掛け、このプログラム自体は 送信データが移動出来る状況になるまでループさせ ループの外で 結果ファイルメール配信とファイル退避っていう感じで やってみます。
退会済みユーザー

退会済みユーザー

2021/03/05 10:24

わかりました。また御協力できることあれば。
guest

回答1

0

自己解決

ご見解ありがとうございます、しかしながら方針をかえました。
クラウド環境の送信後に得られる結果ファイル名のフルパス名を 引数に与え それをメールかつ・当該フォルダ全体を退避する作りに変えました。

このプログラムを送信処理のバットファイル最後に定義づければ 監視自体いらないのでは というように思い始めました....

追記: 残念ながら 送信用途のバットファイルはベンダ様から提供されているためだからか、やることをやったら勝手に閉じてしまう作りになっているようです。私が作ったプログラムは このバットファイルの起動前か 起動してすぐ 主処理の前に挿入させもらうしかなさそうです。

投稿2021/03/05 07:51

編集2021/03/05 09:45
saya24

総合スコア246

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問