文章目录
- python 检测文件变化调用 shell 脚本的例子
- watchdog 方式
- 轮询方式
- python csh 脚本调用
python 检测文件变化调用 shell 脚本的例子
watchdog 方式
在 Python 中,你可以使用 watchdog
库来监测文件系统变化,然后当检测到特定的变化时,调用一个 csh
脚本。以下是一个简单的例子:
首先,你需要安装 watchdog
库,可以通过 pip
来安装:
pip install watchdog
然后,你可以创建一个 Python 脚本来监测文件变化,并在变化发生时执行 csh
脚本。以下是具体的代码例子:
from watchdog.observers import Observer
from watchdog.events import FileSystemEventHandler
import os
import time
import subprocess
class MyHandler(FileSystemEventHandler):
def on_modified(self, event):
if event.is_directory:
return None
if event.src_path.endswith(".txt"): # 指定要监测的文件类型
print(f"文件被修改了: {event.src_path}")
# 调用 csh 脚本
subprocess.run(["/path/to/your/script.csh"], shell=True)
if __name__ == "__main__":
path = "/path/to/watched/directory" # 要监控的目录路径
event_handler = MyHandler()
observer = Observer()
observer.schedule(event_handler, path, recursive=True)
observer.start()
try:
while True:
time.sleep(1)
except KeyboardInterrupt:
observer.stop()
observer.join()
在这个例子中,MyHandler
类定义了一个事件处理器,它重写了 on_modified
方法来处理文件被修改的事件。当监测到 .txt
文件被修改时,脚本将打印出被修改的文件路径,并调用 subprocess.run
来执行 csh
脚本。你需要将 "/path/to/your/script.csh"
替换成你的 csh
脚本的实际路径,并将 "/path/to/watched/directory"
替换为你想要监控的目录的路径。
记得更改 if event.src_path.endswith(".txt"):
这一行,以匹配你想要监控的具体文件类型,或者根据需要修改成其他的条件。
这个脚本会一直运行,直到你手动停止它(例如,通过按 Ctrl+C)。每当指定类型的文件发生变化时,都会调用 csh
脚本。请确保你的 csh
脚本有执行权限。
轮询方式
如果你不想使用 watchdog
库来检测文件变化,你可以使用 Python 标准库中的 os
和 time
模块来轮询文件状态,从而检测文件变化。以下是一个简单的例子,展示如何通过轮询来检测文件变化,并且在变化发生时调用 csh
脚本:
import os
import time
import subprocess
# 要监控的文件
monitored_file = "/path/to/your/file.txt"
# 获取文件最后修改时间
last_modified_time = os.path.getmtime(monitored_file)
while True:
try:
# 检查文件最后修改时间是否有变化
current_modified_time = os.path.getmtime(monitored_file)
if current_modified_time != last_modified_time:
# 文件有变化
print(f"检测到文件变化: {monitored_file}")
# 更新最后修改时间
last_modified_time = current_modified_time
# 调用 csh 脚本
subprocess.run(["/path/to/your/script.csh"], shell=True)
# 每隔一定时间检查一次
time.sleep(1)
except KeyboardInterrupt:
# 用户中断程序执行
break
except FileNotFoundError:
# 文件不存在时的处理
print(f"文件未找到: {monitored_file}")
break
except Exception as e:
# 其他异常的处理
print(f"发生错误: {e}")
break
将 /path/to/your/file.txt
替换为你想要监控的文件路径,而 /path/to/your/script.csh
替换为你的 csh
脚本的路径。这个脚本会无限循环,每秒检查一次文件的最后修改时间,以便检测文件是否有变化。如果检测到文件变化,它会调用指定的 csh
脚本。
请注意,这种轮询方法可能不如 watchdog
库那样高效,因为它需要不断地检查文件状态,这可能会对性能产生一定的影响,尤其是当有大量文件需要监控时。此外,轮询间隔时间(在 time.sleep(1)
中设定)会影响检测变化的灵敏度。如果需要更快地响应文件变化,可以将间隔时间设置得更短,但这将增加 CPU 使用率。
python csh 脚本调用
在Python中,你可以使用subprocess
模块来执行任何外部命令和脚本,包括csh
脚本。subprocess.run()
函数是推荐的方法,因为它能够很好地处理多数用例。以下是如何使用subprocess.run()
执行csh
脚本的例子:
import subprocess
# 指定 csh 脚本的路径
script_path = '/path/to/your/script.csh'
# 使用subprocess.run()来执行csh脚本
# 注意:'csh'指明了要使用的shell
result = subprocess.run(['csh', script_path], capture_output=True, text=True)
# 打印输出结果和错误(如果有的话)
print('stdout:', result.stdout)
print('stderr:', result.stderr)
# 检查脚本是否成功执行
if result.returncode == 0:
print('脚本执行成功。')
else:
print('脚本执行失败。')
在上面的代码中,请确保将/path/to/your/script.csh
替换为你的csh
脚本的实际路径。
这里有几点需要注意:
-
capture_output=True
告诉subprocess.run()
捕获命令的标准输出和错误输出。如果你不需要这些输出,可以省略此参数。 -
text=True
表示将捕获的输出作为文本(字符串)处理,而不是字节序列。在 Python 3.7之前,需要使用universal_newlines=True
。 - 我们将
'csh'
作为命令的一部分传递,表示要使用csh
来执行脚本,而不是默认的sh
。 -
result.returncode
属性包含脚本退出时的状态码。通常,状态码为0表示成功,非0表示发生了错误。
记得为你的csh
脚本赋予执行权限,使用chmod
命令可以这样做:
chmod +x /path/to/your/script.csh
这将使脚本可执行,并允许Python脚本调用它。