EDIT:ここにファイル名へのアクセスです全体パッケージに関する:
filepath = __file__ if __name__ == '__main__' else __name__
次のような構造のために
、それが得られます。ここでは
mypack
├── __main__.py # -> mypack.__main__
└── sub
├── __init__.py
└── sub.py # -> mypack.sub.sub
は抜粋です:
def logger(name=None, root_name=PACKAGE_NAME):
if name:
return logging.getLogger(root_name + '.' + name)
else:
return logging.getLogger(root_name)
私は通常のすべてのモジュールによってインポートcommons.py
またはutils.py
、この関数を定義します私のパッケージ。
import utils
logger = utils.logger()
logger.info('module xxx started')
または特定の概念に捧げsublogger:
import utils
logger = utils.logger('vm')
logger.info('module vm.xxx started')
ファイルパスsubloggerシステムを利用して
は、このパッケージは、パッケージの主なロギングを使用することができますロギング設定がデカップリングされ、明示的にバインドされます。 モジュールごとに自動化することができ:
import utils
logger = utils.logger(__file__)
logger.info('module ' + __file__ + ' started')
subloggerシステムの、ロガー「pk.vmは」(デフォルトでは)「PK」構成のために継承しますので、それは同じハンドラを使用して言うことです、同じロギングファイルに書き込むことができます。 はしかし、それはどのsubloggerのためのいくつかの特定の動作やハンドラを定義することが有用であることができます。
logging.config.dictConfig({
'version': 1,
'disable_existing_loggers': True,
'formatters': {
'verbose': {
'format': '%(levelname)s %(asctime)s %(module)s %(process)d %(thread)d %(message)s',
},
'simple': {
'format': '%(levelname)s %(message)s',
},
},
'handlers': {
'console':{
'level':LOG_LEVEL,
'class':'logging.StreamHandler',
'formatter': 'simple',
},
'logfile': {
'level': LOG_LEVEL,
'class': 'logging.handlers.RotatingFileHandler',
'filename': DIR_LOGS + LOGGER_NAME + '.log',
'mode': 'w',
'maxBytes': LOGFILE_MAX_SIZE,
'formatter': 'verbose',
},
'logfile' + SUBLOGGER_SEPARATOR + SUBLOGGER_VM: {
'level': LOG_LEVEL,
'class': 'logging.handlers.RotatingFileHandler',
'filename': DIR_LOGS + LOGGER_NAME + '.' + SUBLOGGER_VM + '.log',
'mode': 'w',
'maxBytes': LOGFILE_MAX_SIZE,
'formatter': 'verbose',
},
},
'loggers': {
PACKAGE_NAME: {
'handlers':['console', 'logfile'],
'propagate': True,
'level':LOG_LEVEL,
},
PACKAGE_NAME + SUBLOGGER_SEPARATOR + SUBLOGGER_VM: {
'handlers':['logfile' + SUBLOGGER_SEPARATOR + SUBLOGGER_VM],
'level':LOG_LEVEL,
},
}
})
動作しますが、何を__nameの使用について言うことができ__さんは、モジュール構造を反映すべきか?異なる答え/マニュアルでは、彼らは常に "network.pyはproxy.py(main.py)に比べてサブモジュールにあります"と言っていますが、ファイルの1つがトップレベルにある場合、これをどのように利用するのか分かりません。 – VladimirLenin
これまで見てきたように、モジュールはパッケージアーキテクチャのどこにいるのかを知る必要があります。これはおそらく良い解決策ではありません。 – aluriak
私は自分の答えを編集しました:\ __ name__と\ __ file__は、アーキテクチャ内のファイルの場所を取得するために使用できます。 – aluriak