这个主题已被多次介绍过,但我仍然无法让我的包工作。
情况就是这样:我有一个包logging
模块负责设置日志记录。
很明显,mypackage.logging
与标准库中的Python logging
冲突。
目录'结构:
├── mypackage
│ ├── __init__.py
│ ├── logging.py
└── script.py
mypackage的.__初始化__
import logging
from . import logging as _logging
logger = logging.getLogger(__name__)
def main():
_logging.init_logging()
logger.info("hello")
mypackage.logging
"""logging - Setup logging for mypackage."""
import copy
import logging
import logging.config
_DEFAULT_LOGGING_CONFIG_DICT = {
'version': 1,
'formatters': {
'verbose': {
'format': '%(asctime)s - %(name)s::%(levelname)s: %(message)s',
},
'simple': {
'format': '-- %(message)s',
},
},
'handlers': {
'console': {
'class': 'logging.StreamHandler',
'level': 'DEBUG',
'formatter': 'simple',
},
'file': {
'class': 'logging.FileHandler',
'filename': 'oprpred.log',
'mode': 'w',
'formatter': 'verbose',
},
},
'loggers': {
'oprpred': {
'level': 'INFO',
},
},
'root': {
'level': 'INFO',
'handlers': ['console', 'file'],
},
}
def init_logging(verbose=False):
"""Initialize logging.
Set the log level to debug if verbose mode is on.
Capture warnings.
"""
d = default_logging_dict()
if verbose:
d['root']['level'] = 'DEBUG'
d['loggers']['oprpred']['level'] = 'DEBUG'
logging.config.dictConfig(d)
logging.captureWarnings(True)
def default_logging_dict():
return copy.deepcopy(_DEFAULT_LOGGING_CONFIG_DICT)
script.py
import mypackage
mypackage.main()
最后,这是我收到的错误消息:
$ python3 script.py [11:09:01]
Traceback (most recent call last):
File "script.py", line 4, in <module>
mypackage.main()
File "/Users/benoist/Desktop/test_logging/mypackage/__init__.py", line 8, in main
_logging.init_logging()
AttributeError: module 'logging' has no attribute 'init_logging'
最后评论,我注意到如果在mypackage.__init.py__
我在标准库mypackage.logging
之前导入logging
,它就可以了。
我不想这样做,因为它违反了Python PEP8的建议:
进口应按以下顺序分组:
- 标准库导入
- 相关的第三方导入
- 本地应用程序/库特定导入
醇>
非常感谢任何帮助。
本。
P.S。我正在使用Python 3.5.1。
答案 0 :(得分:0)
我处理使用自定义日志记录模块这一特定问题的方法是将所有日志记录功能导入我的自定义模块。现在,您也可以使用自定义版本重新实现模块级功能。
例如:
"""logging - Setup logging for mypackage."""
import copy
from logging import *
import logging.config
_DEFAULT_LOGGING_CONFIG_DICT = { ... }
def init_logging(verbose=False):
...
def default_logging_dict():
...
现在您只需要导入自定义模块。
from . import logging
log = logging.getLogger()
使用from logging import *
的替代方法是从内置日志记录模块重新实现任何常用函数。
import copy
import logging
def getLogger(*args, **kwargs):
logging.getLogger(*args, **kwargs)
如果您需要访问尚未重新实现的日志记录功能,则可以调用内置日志记录模块,例如:logging.logging.addLevelName(...)
。