Closed5

ファイルの変更を監視してスクリプトを実行する、プログラムを作る。

トーテムトーテム

方針

作成予定の仕様?

  • 監視対象のファイルに変更があったときに、コマンドを実行する。
  • 使用言語、python
  • 最終作成物の拡張子は、.exe

コマンド引数

  • 監視対象のファイル
  • 実行するコマンド

オプション

  • なし
トーテムトーテム

#1 Chat GPTでサンプルの作成

Watchdogでできるようだったが、よくわからなかったため、Chat GPTにサンプルコードを出力してもらうことにした。以下、質問内容と出力内容。

ChatGPT出力内容

質問

引数に、監視対象ファイル名とコマンドを指定して、監視対象ファイルに変更があったときに、コマンドを実行するプログラムを作成してください。言語はPyhoneでお願いします。

PythonPyhoneになっているが問題なく出力された。

回答

※ 前後の回答は省略

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にクローズされました