如何在pytest中忽略venv目录下第三方库的警告?
如何屏蔽pytest中venv目录第三方库的警告,保留自有代码警告
问题场景
运行pytest时,会同时收到自有代码和venv目录下第三方库的警告,希望仅保留自有代码的警告,屏蔽第三方库的:
============================================ warnings summary ============================================ test_auth.py: 3 warnings C:\Users\User\<my project>\security.py:33: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC). expire = datetime.utcnow() + timedelta(days=settings.REFRESH_TOKEN_EXPIRE_DAYS) test_auth.py: 2 warnings C:\Users\User\<my project>\venv\Lib\site-packages\jose\jwt.py:311: DeprecationWarning: datetime.datetime.utcnow() is deprecated and scheduled for removal in a future version. Use timezone-aware objects to represent datetimes in UTC: datetime.datetime.now(datetime.UTC). now = timegm(datetime.utcnow().utctimetuple())
解决方案
1. 修改pytest配置文件(持久化推荐)
在项目根目录创建或修改配置文件,添加路径过滤规则:
用pytest.ini的写法:
[pytest] # 忽略所有来自venv目录的警告 filterwarnings = ignore:::*/venv/*
该规则会匹配所有路径包含venv的警告源,直接忽略,不影响自有代码的警告输出。
用pyproject.toml的写法:
[tool.pytest.ini_options] filterwarnings = [ "ignore:::*/venv/*", ]
2. 自定义conftest.py钩子函数
如果需要更灵活的控制,可在项目根目录的conftest.py中添加自定义警告处理逻辑:
import warnings import os def pytest_configure(config): # 获取项目根目录(conftest.py所在目录) project_root = os.path.abspath(os.path.dirname(__file__)) # 拼接venv绝对路径 venv_abs_path = os.path.join(project_root, "venv") def venv_warning_filter(message, category, filename, lineno, file=None, line=None): # 检查警告文件路径是否在venv目录内 if venv_abs_path in os.path.abspath(filename): return None # 忽略该警告 # 非venv目录的警告正常输出 return warnings._showwarnmsg_impl(message, category, filename, lineno, file, line) # 替换默认的警告显示函数 warnings.showwarning = venv_warning_filter
这种方式可根据需求扩展过滤逻辑,比如仅忽略特定类型的第三方警告。
3. 命令行临时过滤
如果只是临时需要屏蔽venv警告,无需修改配置文件,直接用命令行参数:
pytest -W ignore:::*/venv/*
内容的提问来源于stack exchange,提问作者MaxiMaxi
相关产品推荐
相关产品推荐

