Python程序运行时如何防止关联文件(SQLite3等)被删除?
解决方案
下面是几个能实现「程序可读写关联文件,同时限制用户只读/无法删除」的实用方案,可根据场景选择:
1. 运行时锁定文件句柄(最直接有效)
核心思路:程序启动时以独占读写模式打开目标文件,保持文件句柄处于打开状态直到程序退出。Windows系统中,文件被打开且锁定时用户无法删除、修改;Linux/macOS下也会限制用户的删除操作(除非强制解除)。
代码示例:
- 针对SQLite数据库:
import sqlite3 import tkinter as tk # 保持数据库连接始终打开(不要提前关闭) db_conn = sqlite3.connect("your_database.db") cursor = db_conn.cursor() # 程序退出时再关闭连接(绑定Tkinter窗口关闭事件) def on_closing(): db_conn.close() root.destroy() root = tk.Tk() root.protocol("WM_DELETE_WINDOW", on_closing) root.mainloop()
- 针对模板、HTML等普通文件:
import tkinter as tk # 以读写模式打开文件,保留文件对象引用 locked_files = [] target_files = ["template.html", "config.tpl"] for path in target_files: f = open(path, "r+b") locked_files.append(f) # 程序运行期间可通过文件对象读写 locked_files[0].write(b"updated content") locked_files[0].seek(0) content = locked_files[0].read() # 退出时关闭所有文件 def on_closing(): for f in locked_files: f.close() root.destroy() root = tk.Tk() root.protocol("WM_DELETE_WINDOW", on_closing) root.mainloop()
2. 静态资源嵌入+动态数据隔离
如果模板、HTML是无需持久化修改的静态资源,可将其打包进程序,仅让数据库文件单独存储并锁定:
- 使用
PyInstaller打包时,通过--add-data参数嵌入静态文件:
pyinstaller --onefile --add-data "template.html:." --add-data "style.tpl:." your_app.py
- 程序运行时从打包路径读取静态文件,用户无法直接访问到这些文件,自然避免被删除;数据库文件则用方案1的方式锁定。
3. 平台特定权限配置(适合多用户环境)
Windows系统:
修改文件权限,让程序运行的用户(如管理员)拥有读写权限,普通用户仅拥有只读权限。可通过文件属性的「安全」选项卡手动配置,或用ctypes调用Windows API批量修改。注意:若程序以普通用户身份运行,此方法不适用。
Linux/macOS系统:
修改文件所有者为程序运行用户,设置权限为644(所有者读写,其他用户只读):
sudo chown your_user:your_group your_database.db template.html sudo chmod 644 your_database.db template.html
普通用户只能读取文件,无法修改或删除;程序以所有者身份运行时可正常读写。
内容的提问来源于stack exchange,提问作者Priyanshu
相关产品推荐
相关产品推荐

