#1 of python - Module and Package

python 모듈과 패키지 개념

개요

  • 정의
    • 모듈
      • python 에서 필드 / 함수 / 클래스들을 모아놓은 파일 (.py)
    • 패키지
      • 모듈들을 한데 묶고 있는 디렉토리
      • 패키지 간의 계층 구조 가능
  • 특징
    • 모듈
      • java 와 달리 클래스 없이 함수와 필드만으로도 구성 가능
      • if __name__ == __main__:
        • 특정 모듈을 직접 실행하는 경우
          • __name__ = __main__
        • 다른 모듈에서 호출하는 경우
          • __name__ = 호출한 모듈명
        • 함수 밖에 존재하는 print 구문 등이 있을 때 이슈 발생
          • 다른 모듈에서 "import 모듈" 하는 순간 print 구문이 실행됨
          • 즉, 실행 주체를 구분하여 처리하기 위해 적용하는 것
    • 패키지
      • __init__.py 파일이 자동 생성됨
        • python 3.4 이후 버전에서는 필수 아님
        • __all__ = ["모듈명"]
          • 다른 모듈에서 해당 패키지 전체 호출 시
          • ex) from A.B import *
            • 지정된 모듈만 import 됨

이슈사항 -ing

  • batch 파일로 정해진 시간에 브라우저별 이미지 크롤링 테스트 도중
    • py 파일 실행 시, 직접 만든 util 모듈에 대해 "ModuleNotFoundError" 에러 발생
    • pycharm 에서 수동 실행하면 이슈 발생하지 않음
    • 구글링 결과
      • 외부에서 실행 시 sys.path list 에 해당 모듈의 path 있어야 한다고 함
      • 그러나 아직 해결하지 못함
  • 별도 프로젝트 만들어 추가 테스트
    • 마찬가지로 batch 파일로 실행하면 from / import 구문으로 모듈 로드에 실패
    • 대신, 동적으로 모듈을 로드하는 방식으로 임시 조치
      • __import__(모듈명, fromlist = [모듈명])
      • 아래 소스 코드 예시

소스코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from module3 import get_module3_info
from test1.module1 import get_module1_info
import sys
 
# sys path list -> packages
print(sys.path)
 
# moduleNotFoundError occurred
get_module3_info()
get_module1_info()
 
# can access to function of module4
mod = __import__('%s' %('module4'), fromlist=['module4'])
mod_cls = getattr(mod, 'Module4')
mod_cls.get_module4_info(0)
cs

References





댓글