假设您的代码正在使用一个模块,该模块使用logging.info来自模块的日志语句,而不是logger.info来自记录器实例,并且您无法控制修改正在使用的模块。
是否可以在不要求维护人员更改代码的情况下为导入的模块自定义日志记录级别?
这些问题描述了一种非常简单的方法来更改特定模块的日志记录级别。
如何禁用请求库中的日志消息?
Python 日志记录 - 禁用导入模块的日志记录
下面的代码按照描述实现了该解决方案,仅记录来自该模块的 ERROR 消息,但它没有按预期转换 WARNING 消息。
当将noise_noise 模块作为字符串文字引用并使用导入符号的名称时,测试模块会产生相同的输出。
run_me.py 缺少什么来抑制 WARN 消息?
编辑:假设此模块代表从其他维护者导入并关闭以进行修改的模块
import logging
def log_things():
logging.warn('WARNING')
logging.info('INFORMATION')
logging.error('DANGER')
Run Code Online (Sandbox Code Playgroud)
import logging
import noisy_noise
import sys
def main(args):
logging.getLogger(noisy_noise.__name__).setLevel(logging.ERROR)
# logging.getLogger('noisy_noise').setLevel(logging.ERROR)
noisy_noise.log_things()
if __name__ == '__main__':
sys.exit(main(sys.argv[1:]))
Run Code Online (Sandbox Code Playgroud)
$ python run_me.py
WARNING:root:WARNING
ERROR:root:DANGER
Run Code Online (Sandbox Code Playgroud) 使用 Python 2.7.9 和 GDAL 1.11.1,并使用 miniconda 进行包管理 --
执行此操作时,对坐标点进行简单的重新投影会导致下述错误。
我对 GDAL 比较陌生,所以我检查了Python GDAL/OGR 1.0 Cookbook中的代码是否 会产生相同的问题,结果确实如此:
from osgeo import ogr
from osgeo import osr
source = osr.SpatialReference()
source.ImportFromEPSG(2927)
target = osr.SpatialReference()
target.ImportFromEPSG(4326)
transform = osr.CoordinateTransformation(source, target)
point = ogr.CreateGeometryFromWkt("POINT (1120351.57 741921.42)")
point.Transform(transform)
print point.ExportToWkt()
Run Code Online (Sandbox Code Playgroud)
这是错误:
/opt/miniconda/envs/pygeo/lib/python2.7/site-packages/osgeo/ogr.pyc in Transform(self, *args)
4880 OGRERR_NONE on success or an error code.
4881 """
-> 4882 return _ogr.Geometry_Transform(self, *args)
4883
4884 def GetSpatialReference(self, *args):
TypeError: in method 'Geometry_Transform', argument 2 of type …Run Code Online (Sandbox Code Playgroud)