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

keyring.get_password()读取Windows凭据管理器凭证时抛出NameError

Windows环境keyring调用凭据库报win32cred/pywintypes未定义故障处理

问题背景

  • 运行环境:Windows系统、Python 3.10
  • 使用目的:通过keyring库安全管理pyodbc、sqlalchemy连接数据库所需的密码,避免明文硬编码在代码中
  • 前置操作:已参考官方公开issue说明手动配置keyring使用Windows凭据库(WinVault)作为后端,所有报错涉及的依赖包均已完成安装
  • 测试代码:
from keyring.backends import Windows
import keyring
keyring.set_keyring(Windows.WinVaultKeyring())
keyring.get_password("Service", "Username")
  • 运行抛出的错误信息:
Traceback (most recent call last):
  File ".\Python310\lib\site-packages\keyring\backends\Windows.py", line 109, in _get_password
    res = win32cred.CredRead(
NameError: name 'win32cred' is not defined

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File ".\Python310\lib\site-packages\keyring\core.py", line 55, in get_password
    return get_keyring().get_password(service_name, username)
  File ".\Python310\lib\site-packages\keyring\backends\Windows.py", line 99, in get_password
    res = self._get_password(service)
  File ".\Python310lib\site-packages\keyring\backends\Windows.py", line 112, in _get_password
    except pywintypes.error as e:
NameError: name 'pywintypes' is not defined
  • 当前环境已安装包及版本:
包名版本号
astroid2.9.3
backcall0.2.0
certifi2021.10.8
cffi1.15.0
charset-normalizer2.0.12
cloudpickle2.1.0
colorama0.4.4
comtypes1.1.11
cryptography37.0.2
dask2022.6.1
executing0.8.3
fsspec2022.5.0
greenlet1.1.2
idna3.3
ipython-genutils0.2.0
isort5.10.1
keyring23.6.0
lazy-object-proxy1.7.1
locket1.0.0
mccabe0.6.1
mistune0.8.4
MouseInfo0.1.3
numpy1.22.3
opencv-python4.5.5.64
packaging21.3
pandas1.4.1
partd1.2.0
pickleshare0.7.5
Pillow9.1.1
pip22.1.2
platformdirs2.5.1
pure-eval0.2.2
PyAutoGUI0.9.53
pycparser2.21
PyGetWindow0.0.9
pylint2.12.2
PyMsgBox1.0.9
pyodbc4.0.32
pyparsing3.0.7
pyperclip1.8.2
PyQt66.3.1
PyQt6-Qt66.3.1
PyQt6-sip13.4.0
PyRect0.2.0
PyScreeze0.1.28
pytesseract0.3.9
python-bidi0.4.2
python-dateutil2.8.2
pytweening1.0.4
pytz2022.1
PyWavelets1.3.0
pywin32303
pywin32-ctypes0.2.0
pywinauto0.6.8
PyYAML6
requests2.27.1
scipy1.8.0
Send2Trash1.8.0
setuptools58.1.0
six1.16.0
SQLAlchemy1.4.39
sudo1.0.0
tifffile2022.3.16
toml0.10.2
toolz0.11.2
torch1.11.0
torchaudio0.11.0
torchvision0.12.0
traitlets5.1.1
typing_extensions4.1.1
urllib31.26.9
wcwidth0.2.5
webencodings0.5.1
wrapt1.13.3

故障原因

该报错和keyring库本身无关,根源是当前环境安装的pywin32==303版本存在已知兼容问题:该版本在部分Python3.10环境下安装时,不会自动执行模块路径注册脚本,导致win32cred、pywintypes等pywin32附属模块虽然已存在于本地安装目录,但不在Python的导入搜索路径中,keyring的Windows后端懒加载这两个模块失败,就会直接抛出NameError。

解决方法

按以下优先级操作,每步完成后重启Python解释器再测试:

  1. 手动执行pywin32路径注册脚本
    打开命令行切换到当前Python环境的根目录,执行命令:
    python Scripts/pywin32_postinstall.py -install
    
    命令行输出The pywin32 extensions were successfully installed即代表注册完成。
  2. 若执行注册脚本后仍报错,直接降级pywin32到无该问题的稳定版本:
    pip install pywin32==302 --force-reinstall
    
  3. 功能验证
    先执行密码写入操作:
    keyring.set_password("Service", "Username", "testpwd123")
    
    再调用keyring.get_password("Service", "Username"),能正常返回testpwd123即代表功能正常,后续可直接读取存储的密码拼接pyodbc、SQLAlchemy连接串,无需明文写密码。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 20:06:26