2016-06-09 4 views
4

이 항목은 여러 번 다루어졌지만 여전히 패키지가 작동하지 않습니다. 여기에 상황이 있습니다 : logging 모듈이 로깅 설정을 담당하는 패키지가 있습니다. 분명히 mypackage.logging은 표준 라이브러리의 Python logging과 충돌합니다.Python 상대/절대 가져 오기 (다시)

디렉토리 '구조 :

"""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을 mypackage.logging

import logging 
from . import logging as _logging 

logger = logging.getLogger(__name__) 

def main(): 
    _logging.init_logging() 
    logger.info("hello") 

init__

├── mypackage 
│   ├── __init__.py 
│   ├── logging.py 
└── script.py 

myPackage에 .__

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에 가져 오면, 작동 것으로 나타났습니다. 이 파이썬 PEP8의 recommandations에 대해이기 때문에 나는 그렇게하고 싶지 않아 :

수입은 다음과 같은 순서로 그룹화해야 :

  1. 표준 라이브러리 수입
  2. 관련 타사 수입
  3. 로컬 응용 프로그램/라이브러리 별 가져 오기

도움을 주시면 대단히 감사하겠습니다.

벤.

P. 파이썬 3.5.1을 사용하고 있습니다.

+0

표준 로깅 모듈을'_logging' 및 자신의 로깅 모듈을'logging'으로 임포트하면 작동합니다. 일반적으로,'__init __. py'에서 자신의 패키지에서 가져온 것들은 실제 이름으로 가져와야하며, 그 이름을 아무 것도 가리 지 말아야합니다. 필자는 Python 3을 설치하지 않아도 테스트 할 수 있습니다. – user2357112

답변

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(...)합니다.

+0

나는 이것이 효과가있을 것이라고 생각한다. 'from logging import *'가 매우 안전하지 않기 때문에 나에게 "더러운 트릭"으로 보이고 이런 이유로 추천하지 않는다. – blaurent

+0

또 다른 옵션은'import logging'을 사용하고 자주 사용하는 함수, 특히'getLogger()'를 다시 구현하는 것입니다. ('logging.logging.setLevel (...)')을 통해 호출함으로써 어떤 로깅 루틴이든 접근 할 수있다. – amicitas

+0

귀하의 조언에 감사드립니다. 나는이 질문에 아무도 대답하지 않은 것이 놀랍다. 당신이 제안한 해결책이이 일을하는 공식적인 좋은 방법이라면, 나는 그것을 아주 못생긴 정직하게 발견합니다. 나는 파이썬에 대한 추악한 솔루션에 익숙하지 않기 때문에 놀랐습니다! – blaurent