能否禁止Python脚本修改/删除文件?复制目录时的防护实现问询
如何阻止Python脚本修改或删除指定目录?
当然可以实现这个需求!下面给你几个实用的方案,从简单直接到灵活定制都有,你可以根据自己的场景选择:
1. 文件系统层面限制(最直接的强保护)
如果你想从根源上锁住目标目录,不让任何进程(包括你的脚本)修改/删除它,可以直接修改目录的权限,让当前用户只有读取和执行权限:
import os import stat import shutil # 定义要保护的目录路径 protected_path = "your_target_directory" # 先保存原权限,方便后续恢复 original_mode = os.stat(protected_path).st_mode # 修改为只读权限(当前用户、组、其他用户都只能读和进入目录) os.chmod(protected_path, stat.S_IRUSR | stat.S_IXUSR | stat.S_IRGRP | stat.S_IXGRP | stat.S_IROTH | stat.S_IXOTH) # 尝试删除会直接触发PermissionError try: shutil.rmtree(protected_path) except PermissionError as e: print(f"操作被阻止:{e}") # 如果之后需要恢复目录的可修改权限,把原权限改回去就行 os.chmod(protected_path, original_mode)
注意:这个方法是系统级的限制,不仅会阻止你的脚本,其他程序也无法修改该目录,适合需要强保护的场景。
2. 自定义包装函数(脚本内部拦截)
如果你只想在自己的脚本里限制危险操作,不影响其他进程,可以封装shutil、os里的删除/修改函数,让它们遇到受保护目录时直接报错:
import shutil import os # 定义要保护的目录 protected_dir = "your_protected_directory" # 先备份原有的rmtree函数 original_rmtree = shutil.rmtree # 自定义受保护的rmtree函数 def protected_rmtree(path, *args, **kwargs): # 检查要操作的路径是否是受保护目录,或者包含在受保护目录里 abs_path = os.path.abspath(path) abs_protected = os.path.abspath(protected_dir) if abs_path == abs_protected or abs_path.startswith(f"{abs_protected}{os.sep}"): raise PermissionError(f"禁止操作受保护目录:{path}") # 非保护目录则执行原函数 original_rmtree(path, *args, **kwargs) # 替换原有的shutil.rmtree shutil.rmtree = protected_rmtree # 测试:删除保护目录会触发报错 try: shutil.rmtree(protected_dir) except PermissionError as e: print(e) # 输出:禁止操作受保护目录:your_protected_directory
用同样的方式,你还可以包装os.remove、os.rmdir、shutil.move等其他修改类函数,实现脚本内部的全面拦截。
3. 上下文管理器(临时保护)
如果只是想在某一段代码执行期间临时保护目录,执行完后自动恢复权限,可以写一个上下文管理器:
import os import stat import shutil from contextlib import contextmanager @contextmanager def protect_directory(path): # 保存原权限 original_mode = os.stat(path).st_mode # 临时设置为只读 os.chmod(path, stat.S_IRUSR | stat.S_IXUSR | stat.S_IRGRP | stat.S_IXGRP | stat.S_IROTH | stat.S_IXOTH) try: yield # 执行with块里的代码 finally: # 不管代码执行结果如何,都恢复原权限 os.chmod(path, original_mode) # 使用示例 with protect_directory("your_target_directory"): # 这段代码里,目录处于只读保护状态 try: shutil.rmtree("your_target_directory") except PermissionError: print("操作被阻止:目录当前处于保护状态") # 退出with块后,目录权限自动恢复正常
内容的提问来源于stack exchange,提问作者Adam Stepniak
相关产品推荐
相关产品推荐

