在不修改第三方代码的情况下抑制警告
我们使用了一个第三方的开源工具,它生成了一个警告:
DeprecationWarning: The compiler package is deprecated and removed in Python 3.x.
我该如何在不修改第三方代码的情况下抑制这个警告呢?
我知道怎么使用 warnings.filter()
来处理警告,但我无法使用它:因为我是在命令行中调用 py.test
,所以在警告产生之前,我的代码没有任何一行会被执行。
在控制台脚本周围创建一个包装器也不是一个可行的选项。
1 个回答
你可以添加一个叫做 usercustomize
或 sitecustomize
的模块,这个模块会在解释器启动时调用 warnings.filter()
。也就是说,当你打开 Python 的时候,它会自动加载这个模块。
详细信息可以查看 自定义模块:
Python 提供了两个可以让你自定义的地方:
sitecustomize
和usercustomize
。要了解它们是怎么工作的,首先你需要找到你的用户 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
文件。