我希望通过我希望处理日志的方式来处理所有警告。即使是在导入库期间发出的这些。
这意味着必须在导入库之前完成日志记录的配置。
经过一段时间的搜索,我认为在自定义sitecustomize.py
中配置日志记录可能是一种解决方案。
但是sitecustomize.py
只是很少有人知道它的黑魔法,甚至更少的人使用它。
是否有更明显的方法可以确保在导入库之前完成我的日志配置?
不幸的是,似乎无法通过环境变量配置日志记录。
更新
根据我的观点,我得不到任何可接受的答案。我认为你需要将登录分为两个责任区:
第一行代码由python解释器执行后,区域"环境"已经对代码负责。现在做任何配置都为时已晚。我希望看到将日志记录设置为调用python解释器的一部分。
一个解决方案可能是环境变量:
PYTHON_LOGGING_CONFIG=/path-to-env/etc/config.yaml
或解释器的参数:
python --logging-config=path-to-env/etc/config.yaml script.py
答案 0 :(得分:5)
如果您希望日志记录覆盖导入,显然没有办法在导入任何其他内容之前显式配置日志记录。
但是,如果您希望日志记录配置更加明显,那么有各种技巧可以帮助您实现这一点。例如,您的主脚本可以像这样简短,只是为了强调特殊情况:
import siteconfiguration
siteconfiguration.configure_site() # This must be done before any other import
import application
if __name__ == "__main__":
application.run()
这仍然打破了将所有进口放在首位的规则,但它也清楚地说明了为什么要这样做。使用该代码的每个人都将了解您的意图。
特殊情况不足以打破规则。
虽然实用性胜过纯洁。
(Python的禅宗,蒂姆·彼得斯)
答案 1 :(得分:0)
如果导入顺序很重要,或者文件顶部的import语句之间有代码,我不喜欢它。我喜欢使用自动化工具清理我的代码,这可能会破坏内容。
如果您希望某些事情发生首先,请先执行 。如果要修改import
的工作方式,则需要在调用import
之前执行此操作。如果您的问题是由您的编辑引起的,那么要么更改它,找到不重新排序子句的方法,要么将代码放在名字最先出现的模块中,例如: import aaaaaa_logging_overrides
。
说你的代码看起来像@zvone的解决方案;并且您的编辑重新排序来自:
的导入import siteconfiguration
siteconfiguration.configure_site() # This must be done before any other import
import application
到
import application
import siteconfiguration
siteconfiguration.configure_site() # This must be done before any other import
我很可能会改变编辑。这非常类似于搞乱下面的代码,显然编辑器不应该重新排序导入并在路径操作之前将它们放入:
import sys
sys.path.append('/nfs/some/corp/dir')
import corp.module
您的python内容位于sys.prefix
下。应该有:
lib/python-*/site.py
lib/python-*/site-packages
lib/python-*/sitecustomize.py
(可选,取决于您的管理员是否使用过)e.g。
(test)/tmp/test > (4) cat lib/python2.7/sitecustomize.py
print 'imported sitecustomize'
(test)/tmp/test > (4) cat foo.py
print 'executing foo'
运行示例:
(test)/tmp/test > (4) python foo.py
imported sitecustomize
executing foo
正如你所说,这是黑魔法;因为运行脚本的用户可能不会期望某些其他随机代码(读取:可能不在其控制之下,而不是标准分发的一部分)来运行和改变行为。