【Python 常用脚本及命令系列 3 -- python 检测文件变化调用shell 脚本的例子】

文章目录

    • 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 标准库中的 ostime 模块来轮询文件状态,从而检测文件变化。以下是一个简单的例子,展示如何通过轮询来检测文件变化,并且在变化发生时调用 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脚本调用它。

你可能感兴趣的:(#,python,script,python,linux,python,csh)