向文件写入字节时报错:'bool'对象不支持上下文管理器协议
问题分析与解决
核心报错原因
TypeError: 'bool' object does not support the context manager protocol的直接诱因是**self.key_path被赋值为布尔类型(True/False),而非预期的文件路径字符串**。
问题出在get_key_path()方法上——这个方法返回了布尔值(比如创建目录/文件时的操作成功/失败状态),导致self.key_path = self.get_key_path()把布尔值存进了属性里,后续调用open(self.key_path, "wb")时,自然无法用布尔值作为文件路径参数。
代码中的其他问题
除了路径类型错误,你的代码还有几处语法和逻辑问题:
def key():定义时缺少self参数,类方法必须传入self才能访问实例属性(比如self.key_path)。if path.exists(self.key_path) and stat(self.key_path).st_size == 0:语句后的代码块没有缩进,会触发语法错误。- 使用
with open(...) as file:上下文管理器时,不需要手动调用file.close(),管理器会自动处理文件关闭。 - 读取密钥时用
"r"文本模式,但密钥是用"wb"二进制模式写入的,应该用"rb"模式读取,否则会出现编码不兼容问题。
修正后的代码示例
import os from cryptography.fernet import Fernet from stat import stat class App(CTk): def __init__(self): super().__init__() self.count = True self.db_path = self.get_db_path() # 确保get_key_path返回字符串格式的路径 self.key_path = self.get_key_path() self.dirFile_setup() self.b64key = self.key() # 修复:添加self参数 def key(self): # 修复:缩进代码块 if os.path.exists(self.key_path) and stat(self.key_path).st_size == 0: key_ = Fernet.generate_key() print(type(key_)) # 移除多余的file.close() with open(self.key_path, "wb") as file: file.write(key_) return key_ else: # 修复:用rb模式读取二进制密钥 with open(self.key_path, "rb") as file: return file.readline() # 确保get_key_path返回路径字符串的示例实现 def get_key_path(self): usr_path = os.path.expanduser("~") manager_dir = os.path.join(usr_path, ".PassManager") # 创建目录(如果不存在) if not os.path.exists(manager_dir): os.makedirs(manager_dir) # 返回完整密钥文件路径,而非操作状态 return os.path.join(manager_dir, "PassManager.key")
关键修复点
- 修正
get_key_path()方法,确保它返回字符串格式的完整文件路径,而非创建目录/文件的布尔结果。 - 给
key()方法添加self参数,保证能正常访问实例的self.key_path属性。 - 修正代码缩进,避免语法错误。
- 统一文件读写模式:写入用
wb,读取用rb,避免编码不兼容问题。
内容的提问来源于stack exchange,提问作者Rohit Dalal
相关产品推荐
相关产品推荐

