无法在Python 3.5(Ubuntu系统)通过pip安装secrets库怎么办?
解决Python 3.5无法使用secrets模块的方案
嘿,这个问题我之前也碰到过!secrets模块其实是Python 3.6才正式加入标准库的,所以Python 3.5确实既没有自带,也没法通过pip安装——毕竟它不是第三方包嘛。给你几个可行的解决办法:
1. 手动移植兼容版的secrets模块
secrets的核心功能其实依赖Python 3.5已经具备的os.urandom和hashlib等模块,你可以直接把适配3.5的secrets.py代码放到项目目录里,就能像标准库一样导入使用了:
- 找到Python官方仓库中对应3.6版本的
secrets.py源码(注意要修改掉3.5不支持的语法,比如把f-string替换成.format()) - 把修改后的代码保存为项目根目录下的
secrets.py - 之后在你的代码里直接
import secrets即可,Python会优先加载本地的这个文件
举个简化版的兼容代码示例:
import os import random import base64 import hashlib def randbelow(n): return random.SystemRandom().randint(0, n-1) def token_bytes(nbytes=16): return os.urandom(nbytes) def token_hex(nbytes=16): return token_bytes(nbytes).hex() def token_urlsafe(nbytes=16): return base64.urlsafe_b64encode(token_bytes(nbytes)).decode('utf-8').rstrip('=')
2. 直接实现所需的核心功能
如果你只用到secrets的部分功能,完全可以自己手动实现,不用引入整个模块:
- 生成URL安全的随机令牌:用
os.urandom生成加密安全的字节流,再通过base64.urlsafe_b64encode处理 - 生成随机整数:用
random.SystemRandom()来生成加密安全的随机数,避免普通random模块的安全隐患
比如生成URL安全令牌的极简代码:
import os import base64 def generate_safe_token(length=16): return base64.urlsafe_b64encode(os.urandom(length)).decode('utf-8').replace('=', '')
3. 升级Python到3.6及以上版本
如果系统环境允许的话,升级Python版本是最彻底的解决办法。在Ubuntu 16.04上可以通过PPA来安装Python 3.6:
sudo add-apt-repository ppa:deadsnakes/ppa sudo apt-get update sudo apt-get install python3.6
安装完成后,用python3.6来运行你的脚本,就能直接使用标准库的secrets模块了。注意不要轻易修改系统默认的Python版本,避免影响系统依赖。
内容的提问来源于stack exchange,提问作者Harshwardhan Jain
相关产品推荐
相关产品推荐

