Fedora下pyenv安装Python使用cryptacular.bcrypt报返回None错误
Fedora 34 pyenv环境cryptacular运行报错问题
问题说明
这是Fedora 34系统下的特定场景报错,仅通过pyenv安装的Python 3.9.7、3.8.12版本运行时触发,系统自带同版本Python运行无异常,目前暂无法确认问题根因属于pyenv还是cryptacular库。
复现步骤
- 按照官方说明安装pyenv:先安装构建依赖,再安装pyenv,最后配置shell环境变量。
- 使用pyenv安装Python 3.9.7,并设置为全局Python版本:
$ pyenv install 3.9.7 $ pyenv global 3.9.7
- 创建虚拟环境,安装1.6.2版本的cryptacular:
$ python -m venv venv $ ./venv/bin/pip install cryptacular
- 新建
minimal.py文件,写入测试代码:
from cryptacular.bcrypt import BCRYPTPasswordManager pm = BCRYPTPasswordManager() print(pm.encode("Password123!"))
- 运行测试代码,触发报错:
$ ./venv/bin/python minimal.py Traceback (most recent call last): File "/home/vagrant/minimal.py", line 4, in <module> pm.encode("Password123!") File "/home/vagrant/venv/lib/python3.9/site-packages/cryptacular/bcrypt/__init__.py", line 54, in encode raise ValueError("_bcrypt.crypt_rn returned None") ValueError: _bcrypt.crypt_rn returned None
- 切换到系统Python重复上述步骤,无报错可正常输出加密结果:
$ rm -rf venv $ pyenv global system $ python -m venv venv $ ./venv/bin/pip install cryptacular ... ... $ ./venv/bin/python minimal.py $2a$10$mWRafuCTZq.OIZEt5CDln.LFWrj9qFnbjjhIHWL6pXZU4TU/tPm0K
排查思路与解决方案
- 检查补全pyenv编译Python的依赖:Fedora 34中
crypt_rn接口由libxcrypt-devel包提供,先执行dnf install libxcrypt-devel确认该包已安装,避免pyenv编译Python时缺失对应依赖导致底层接口调用异常。 - 重新编译pyenv管理的Python版本:安装完缺失依赖后,执行
pyenv uninstall 3.9.7卸载原有编译版本,再执行pyenv install 3.9.7重新编译,编译过程中注意检查输出是否有依赖相关的警告信息。 - 强制重新编译cryptacular扩展:Python重新安装完成后,删除原有虚拟环境,重新创建虚拟环境后执行
pip install --force-reinstall --no-cache-dir cryptacular,避免使用之前缓存的、基于不完整依赖编译的C扩展包。 - 临时替代方案:如果上述操作无法解决问题,可直接使用官方
bcrypt库替代cryptacular实现密码加密能力,接口调整成本极低,可直接规避当前环境冲突问题。
内容的提问来源于stack exchange,提问作者pxul
相关产品推荐
相关产品推荐

