MacOS Catalina环境下Python Pickle保存闪卡程序出现OSError([Errno 30])只读文件系统错误技术求助
解决MacOS Catalina下Pickle保存数据时的只读文件系统错误
嘿,我之前在MacOS Catalina上用Tkinter开发工具的时候也碰到过一模一样的问题——系统的只读保护机制真的很容易让人踩坑。咱们来一步步搞定这个OSError: [Errno 30]的问题。
问题根源
MacOS Catalina把系统磁盘分成了只读的系统卷和可写的数据卷,如果你的程序默认工作目录在系统保护的区域(比如/usr、应用程序目录,甚至有时候是桌面的某些受保护子文件夹),直接尝试写入文件就会触发只读文件系统的错误。你当前的代码是直接写入相对路径Card1Saves.dat,这个文件会被创建在程序的工作目录里,而这个目录大概率没有写入权限。
解决方案:使用用户可写的目录
最稳妥的办法是把数据文件保存到用户专属的可写目录,比如Documents文件夹——这个目录是系统明确允许用户读写的,不会触发权限问题。
步骤1:修改代码中的文件路径
首先导入os模块,然后用os.path.expanduser()来获取用户的主目录,再拼接出Documents下的保存路径。修改你的代码如下:
关键代码修改:
import os # 新增导入os模块 # ------------------variables-------------------------------------------- backgroundColour = '#e3e6e4' # 定义保存路径到Documents文件夹 save_file = os.path.expanduser("~/Documents/Card1Saves.dat") try: oldNames = pickle.load(open(save_file, "rb")) print("\nold names = ", oldNames) except FileNotFoundError: oldNames = [] # 建议初始化空列表,避免后续使用报错 # ------------------sub routines------------------------------------ def MakeCard(): # ... 其他代码不变 ... def Confirm(): frontTextSave = frontEntry.get("1.0", END).strip() # 去掉多余的换行符 backTextSave = backEntry.get("1.0", END).strip() card1 = [frontTextSave, backTextSave] # 优化:追加新闪卡到列表,而不是覆盖旧数据 oldNames.append(card1) pickle.dump(oldNames, open(save_file, "wb")) inputWindow.destroy() # ... 其他代码不变 ...
额外优化提示
- 你当前的
Confirm()函数每次保存都会覆盖之前的闪卡数据,我在上面的修改里改成了把新闪卡追加到oldNames列表后再保存,这样就能保留所有历史闪卡了。 - 给
frontEntry.get()和backEntry.get()加上.strip(),可以去掉用户输入时不小心加的多余换行符,让保存的数据更整洁。
验证工作目录(可选)
如果还是不确定问题出在哪,可以在代码开头加上一行打印当前工作目录的代码,看看程序到底在哪个目录运行:
import os print("当前工作目录:", os.getcwd())
如果输出的路径是系统保护的目录(比如/Applications或者/usr/bin),那就更能确认是权限问题导致的错误。
为什么这个方法有效?
~/Documents是用户的个人文档目录,MacOS不会对这个目录做只读保护,任何用户程序都有权限在这里读写文件,而且数据也会跟着用户账号同步(如果你用iCloud的话),比保存在程序目录里更安全。
内容的提问来源于stack exchange,提问作者PythonNoob123
相关产品推荐
相关产品推荐

