You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

能否禁止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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 07:10:51