Python 开发中遇到的 bug 记录

5 minute

前言

这里记录了我在 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
  1. Run pip install wheel
  2. 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 版本的)
  3. 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() 返回得到的页面是手机端的界面!如果这个网站手机端的界面和电脑端的界面不是一样的,那么这个问题是很值得注意的。