应使用 pathlib.Path.unlink() 或 os.remove() 删除文件,避免 os.system();因其不安全、不跨平台、无法捕获异常,且 Python 3.10 中 shell 环境更严格,易致命令注入或静默失败。

直接用 pathlib.Path.unlink() 或 os.remove(),别碰 os.system() —— 它既不安全,也不跨平台,还绕过 Python 的异常控制。
为什么 os.system("rm ...") 在 Python 3.10 里特别危险?
Python 3.10 默认启用更严格的子进程环境(尤其在 Windows 上),os.system() 会启动 shell,导致路径中含空格、通配符或用户输入时极易命令注入;同时它返回的是 shell 退出码,不是异常,错误无法被 try/except 捕获。
常见错误现象:
-
os.system("rm file name.txt")在 Linux 下静默失败(空格被当成分隔符) -
os.system(f"rm {user_input}")被传入file; rm -rf /直接执行任意命令 - Windows 上
os.system("del ...")遇到长路径或 Unicode 文件名时抛出FileNotFoundError但不提示具体原因
pathlib.Path.unlink() 是最推荐的替代方案
Python 3.4+ 引入的 pathlib 在 3.10 中已完全成熟,语义清晰、支持链式调用、自动处理路径分隔符和编码问题。
源分发确定性执行服务,采用固定依赖。仅在带有签名审批制品(ClawShield模式)时运行,并产生可验证的输出...
实操建议:
- 删除单个文件:
Path("data.log").unlink(missing_ok=True)——missing_ok=True避免文件不存在时报错(Python 3.8+ 支持) - 删除并确认存在:
if p.exists() and p.is_file(): p.unlink() - 递归删目录(慎用):
shutil.rmtree("temp_dir"),别用Path.rmdir()(只删空目录) - 注意:
unlink()不走回收站,不可逆;如需模拟“移到废纸篓”,得用第三方库如send2trash
os.remove() 和 os.unlink() 的区别与选用场景
二者在 Python 中行为一致(os.unlink() 是别名),但比 os.system() 更底层、无 shell 开销。适合简单脚本或需要兼容老版本 Python(
关键差异点:
-
os.remove("a b.txt")正确处理含空格路径;os.system("rm a b.txt")错误拆分为两个参数 - 报错类型统一为
OSError子类(如PermissionError、FileNotFoundError),可精准捕获 - 在 NFS 或某些容器挂载卷上,
os.remove()可能比Path.unlink()对“文件正被占用”反馈更快(取决于底层实现) - 不支持
missing_ok参数,需手动检查:if os.path.isfile(p): os.remove(p)
真正容易被忽略的是权限和并发场景:即使用了 unlink(),如果文件被其他进程独占打开(如 Windows 上的 Excel 正在编辑 .csv),仍会抛 PermissionError;这时候不是换函数就能解决,得加重试逻辑或改用 os.replace() 先移走再删。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










