在不修改第三方代码的情况下抑制警告

2 投票
1 回答
1818 浏览
提问于 2025-04-18 12:06

我们使用了一个第三方的开源工具,它生成了一个警告:

DeprecationWarning: The compiler package is deprecated and removed in Python 3.x.

我该如何在不修改第三方代码的情况下抑制这个警告呢?

我知道怎么使用 warnings.filter() 来处理警告,但我无法使用它:因为我是在命令行中调用 py.test,所以在警告产生之前,我的代码没有任何一行会被执行。

在控制台脚本周围创建一个包装器也不是一个可行的选项。

1 个回答

3

你可以添加一个叫做 usercustomizesitecustomize 的模块,这个模块会在解释器启动时调用 warnings.filter()。也就是说,当你打开 Python 的时候,它会自动加载这个模块。

详细信息可以查看 自定义模块

Python 提供了两个可以让你自定义的地方:sitecustomizeusercustomize。要了解它们是怎么工作的,首先你需要找到你的用户 site-packages 目录的位置。你可以启动 Python,然后运行以下代码:

>>> import site
>>> site.getusersitepackages()
'/home/user/.local/lib/python2.7/site-packages'

现在你可以在那个目录下创建一个名为 usercustomize.py 的文件,里面可以放任何你想要的内容。这个文件会影响每次运行 Python,除非你用 -s 选项来禁用自动导入。

sitecustomize 的工作方式是一样的,不过通常是由计算机的管理员在全局的 site-packages 目录中创建的,并且它会在 usercustomize 之前被导入。想了解更多细节,可以查看 site 模块的文档。

你可以通过设置 PYTHONUSERBASE 环境变量 来影响 Python 查找的位置,这样你就可以指向一个项目特定的 usercustomize.py 文件,只要你记得路径 lib/python/site-packages 会被加到基础路径中:

$ python -m site --user-site
/Users/someuser/Library/Python/2.7/lib/python/site-packages
$ PYTHONUSERBASE=/foo/bar python -m site --user-site
/foo/bar/lib/python/site-packages

在上面的例子中,如果 PYTHONUSERBASE 设置为 /foo/bar,那么如果存在的话,Python 会加载 /foo/bar/lib/python/site-packages/usercustomize.py

在 Python 的虚拟环境中,会使用一个定制的 site.py 文件,这个文件是基于 Python 2.6 之前的 site.py;这个版本省略了 getusersitepackages() 函数。如果文件 lib/pythonX.X/no-global-site-packages.txt 存在,那么 usercustomize 模块将 不会 被导入。你需要在虚拟环境的 lib/python/site-packages 目录中使用 sitecustomize.py 文件。

撰写回答