Closed5
ファイルの変更を監視してスクリプトを実行する、プログラムを作る。
方針
作成予定の仕様?
- 監視対象のファイルに変更があったときに、コマンドを実行する。
- 使用言語、python
- 最終作成物の拡張子は、.exe
コマンド引数
- 監視対象のファイル
- 実行するコマンド
オプション
- なし
#1 Chat GPTでサンプルの作成
Watchdogでできるようだったが、よくわからなかったため、Chat GPTにサンプルコードを出力してもらうことにした。以下、質問内容と出力内容。
ChatGPT出力内容
質問
引数に、監視対象ファイル名とコマンドを指定して、監視対象ファイルに変更があったときに、コマンドを実行するプログラムを作成してください。言語はPyhoneでお願いします。
Python
がPyhone
になっているが問題なく出力された。
回答
※ 前後の回答は省略
import sys
import subprocess
import time
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
class MyHandler(FileSystemEventHandler):
def __init__(self, command):
super().__init__()
self.command = command
def on_modified(self, event):
print("変更がありました。")
subprocess.run(self.command)
if __name__ == "__main__":
if len(sys.argv) != 3:
print("Usage: python watch.py filename command")
sys.exit(1)
filename = sys.argv[1]
command = sys.argv[2]
event_handler = MyHandler(command)
observer = Observer()
observer.schedule(event_handler, path='.', recursive=True)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()
#2 ファイルの分割とイベント変更
watchdogがやっぱりよくわからないが、以下の変更を加えた。
- ファイルの分割
- イベントの変更
ファイル
ディレクトリ ツリー
src
main.py
Myhandler.py
ファイル
main.py
import sys
import time
from watchdog.observers import Observer
import MyHandler
# メイン関数(最初に呼ばれる関数)
def main():
checkArg()
folderName = sys.argv[1]
command = sys.argv[2]
startWatch(folderName, command)
# コマンドライン引数チェック
def checkArg():
if len(sys.argv) != 3:
print("Usage: python watch.py filename command")
sys.exit(1)
# 監視の開始 <= 監視って言ってるのにwatchを使うてどうなんや。observeじゃね
def startWatch(folderName, command):
event_handler = MyHandler.MyHandler(command)
observer = Observer()
observer.schedule(event_handler, path=folderName, recursive=True) # 設定
observer.start()
print('Stop: Ctrl+C')
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()
# メイン関数の実行
if __name__ == "__main__":
main()
Myhandler.py
import subprocess
from watchdog.events import FileSystemEventHandler
from watchdog.events import FileSystemEvent
class MyHandler(FileSystemEventHandler):
def __init__(self, command):
super().__init__()
self.command = command
def on_any_event(self, event: FileSystemEvent):
print('変更有,event: ', event)
subprocess.run(self.command)
というか、#1でファイルの監視とコマンドの実行が完了したためClose
このスクラップは2023/02/18にクローズされました