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

向文件写入字节时报错:'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")

关键修复点

  1. 修正get_key_path()方法,确保它返回字符串格式的完整文件路径,而非创建目录/文件的布尔结果。
  2. 给key()方法添加self参数,保证能正常访问实例的self.key_path属性。
  3. 修正代码缩进,避免语法错误。
  4. 统一文件读写模式:写入用wb,读取用rb,避免编码不兼容问题。

内容的提问来源于stack exchange,提问作者Rohit Dalal

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 20:22:29