Python 开发中遇到的 bug 记录
前言
这里记录了我在 Python 开发中遇到的 bug,持续更新中。
版本冲突问题
certbot 依赖系统 python3 的 requests 包,但它和某个项目依赖的 requests 包版本不一样,如果项目不使用 venv,将会导致 certbot 不可用。
建议在资源允许的情况下所有项目都使用 venv 来隔离 python 环境。
requests_cache 在多线程环境下发生错误 “database is locked”
代码包含了使用了 requests_cache 的引用包,而引用包中存在的 requests_cache.install_cache
将影响所有范围的 requests,代码中有着多线程操作,其中某个线程长时间占用 sqlite,锁长时间无法释放,从而导致其它线程无法访问数据库(sqlite3 本身是线程安全的)、CPU 占用率飙升。引用包建议单独使用 requests_cache.CachedSession
完成操作。
FYI, a better option for using requests-cache is using CachedSession directly, instead of patching with install_cache(). It makes it more explicit what you are and aren’t caching, and doesn’t affect downstream requests calls. It’s mostly thread-safe, except for cache_disabled(), as you noted; instead, when you want to make a non-cached request, you can just use a regular requests.Session.
[Errno 24] Too many open files
1ulimit -n 50000
Django 手动删除 migrations 目录后 migrate 无效
1python3 manage.py migrate --fake <app-name> zero
2python3 manage.py makemigrations <app-name>
3python3 manage.py migrate
mac m1 python3.7.9 ModuleNotFoundError: No module named ‘_ctypes’
Use python3.7.12 instead.
Windows 下安装 lxml 报错
1Error while installing lxml through pip: Microsoft Visual C++ 14.0 is required
- Run
pip install wheel
- Download lxml from http://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml, if your python version is 3.5, download lxml-3.6.4-cp35-cp35m-win32.whl (补充一句: 经测试 3.12 版本的安装无法 3.11 版本的)
- Run
pip install lxml-3.6.4-cp35-cp35m-win32.whl
UnicodeDecodeError: ‘utf-8’ codec can’t decode byte 0xff in position 0: invalid start byte
byte 0xff in position 0 could also mean the file is encoded in UTF-16, then you can do with open(path, encoding=‘utf-16’) as f: instead
包冲突
1root@Server-Debian-Jzh:~/Codes/tg-jav-bot## python3 bot.py
2Traceback (most recent call last):
3 File "/root/Codes/tg-jav-bot/bot.py", line 13, in <module>
4 import utils.util_javbus as util_javbus
5ModuleNotFoundError: No module named 'utils.util_javbus'; 'utils' is not a package
项目下的 utils 文件夹 <-> pip 某个依赖包中的 utils.py 文件名 “utils” 冲突!
默认先扫描当前目录下包,但是识别不到 utils 包,因为 utils 文件夹下缺失了 __init__.py
文件!
SSLError(SSLCertVerificationError)
使用 requests 库时出现 bug:
1(Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:997)')))
解决方法:python-requests-throwing-sslerror
From requests documentation on SSL verification:
Requests can verify SSL certificates for HTTPS requests, just like a web browser. To check a host’s SSL certificate, you can use the verify argument:
1requests.get('https://kennethreitz.com', verify=True)
pipenv 无法正常 install
1PS C:\Users\akyna\Codes\test\test_py> pipenv install
2Usage: pipenv install [OPTIONS] [PACKAGES]...
3
4ERROR:: --system is intended to be used for pre-existing Pipfile installation, not installation of specific packages. Aborting.
解决方法:
因为pipenv检测到之前在该目录下创建过了环境,需要先删除之前的环境才可以:
1PS C:\Users\akyna\Codes\test\test_py> pipenv --rm
2Removing virtualenv (C:\Users\akyna\.virtualenvs\test_py-_qApXuy4)...
requests 库 headers 字段编码错误
1UnicodeEncodeError: 'latin-1' codec can't encode characters in position 30-34: ordinal not in range(256)
解决方法:
加上.encode(‘utf-8’):
1return {
2 'User-Agent':
3 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/41.0.2272.101 Safari/537.36',
4 'Host': HOST,
5 'Connection': 'close',
6 'X-Requested-With': 'XMLHttpRequest',
7 'Referer': url.encode('utf-8'), ## fix bug
8}
python + crontab 环境变量
crontab运行python时,如果python中使用了环境变量,将无法正常获取。
解决方法:
在crontab中配置好 python 中用到的环境变量:
1## backup
20 1 * * * env code=/root/Codes /bin/bash /root/Codes/scripts/unix/bbak
3## tg send
40 8 * * * env code=/root/Codes /bin/python3 ~/Codes/scripts/py/submit_tg_send.py
关于爬虫所设置的 Headers 中的 UserAgent
这是一个很难以发现的点,但不能说是bug吧。
Headers 中的 UserAgent 可以配置不同的设备端,如果设置了类似于 Android 这样的手机端,那从 requests.get()
返回得到的页面是手机端的界面!如果这个网站手机端的界面和电脑端的界面不是一样的,那么这个问题是很值得注意的。