[Basic] 모듈, 패키지

고보·2024년 1월 29일

Python 기초 강의 정리

목록 보기
10/15

1 모듈

  • 모듈: 이미 만들어진 기능 들고 와서 쓰기. 특정 기능을 가진 파이썬 파일.

1-1 모듈 만들기

  • .py 확장자로 만들어야 한다.
  • 만약 .ipynb 확장자의 경우 수정 방법.
    - 프롬프트에 주소 디렉토리 옮겨서 아래처럼 이용.
    jupyter nbconvert __to script 제목.ipynb
    - 매직커맨드 이용: 코드 작성 중 하나의 셀을 파이썬 파일로 저장
    %%write file 제목.py

1-2 모듈 불러오기

  • 단일 모듈: import 모듈명
  • 이후에 모듈 함수, 상수를 이용할 때는 모듈명.함수명 모듈명.상수명
  • 모듈 별칭 지정: import 모듈명 as 별칭
  • 모듈 특정 함수나 변수만: from 모듈명 import 함수, 상수, 클래스 등
  • 모듈 모든 요소 들고오기: from 모듈명 import *

1-3 __name__

  • 현재 실행 중인 파일을 지정하는, 파이썬 기본 제공 변수.
  • __name__ == 모듈이름 으로 저장되어 있다. 하지만 여기서 실행 파일은 '__main__'이 저장된다.
  • 이를 통해 실행 파일을 구분 가능. 인터프리터가 main인 파일을 찾아가서 그것부터 실행하는 거다.
    print(f'__name__: {__name__}')을 모듈 파일 맨 밑에 넣어두면,
    모듈 실행할 때 그 모듈 파일 자체를 실행하면 print(f'__name__: {__main__}')이, 다른 파일에서 import한 경우엔 print(f'__name__: {파일명}')
  • 따라서 if __name__ == '__main__'을 하면, 그 모듈 파일 자체로 실행할 때만 실행되는 부분을 만들 수 있다.

1-4 다른 디렉터리에 있는 모듈 불러오기

  • 실행 파일과 동일한 디렉토리에 있는 것은 원래 사용 가능
  • pycharm 내 컴퓨터 작업 기준: C:/pythonEx/project/pythonProject/venv/lib/site-packages 에 넣으면 이 프로젝트 어디든 쓸 수 있는 범용성 모듈 됨
    • ven v: 가상 환경(virtual environment). 가산 환경을 하나 만들고 작업을 하면 독립적으로 환경 세팅이 가능하기 때문에, 프로젝트별로 운영되는 것.
  • spyder에서, 환경설정으로 원하는 폴더 추가
  • 파이썬 셸에서(anaconda 등) sys 이용
python
import sys
sys.path => 현재 라이브러리 설치된 디렉터리 목록 보여주고, 여기 있는 모듈들은 그냥 사용 가능
sys.path.append('경로')  => 지정한 디렉터리 추가
  • 파이썬 셸에서 PYTHONPATH 환경 변수 사용
set PYTHONPATH=C:/doit/mymod => 대문자. 이렇게 하면 디렉터리 설정. 
python
import mod2

2 패키지

  • 모듈을 묶어서 관리하는 것
  • 패키지 호출: from 패키지 import 모듈(위의 from 모듈 import 함수와 같음)

2-1 패키지 만들기

  • 먼저 폴더로 디렉토리를 설정한다. 상위부터 하위까지 각자 폴더로 만든다. 예를 들면
  • game(folder)
    • __init__.py
    • sound(folder)
      • __init__.py
      • echo.py
    • graphic(folder)
      • __init__.py
      • render.py
  • 각자 폴더에 .py로 모듈을 만들어서 그걸 불러오는 것
  • __init__.py는, 해당 디렉터리가 패키지의 일부임을 알려주는 역할을 한다. 내용은 없어도 되고, 이게 없으면 패키지 일부로 인식을 안한다. => 패키지를 불러오면 이것부터 실행이 되기 때문에, 초기화 코드 포함하거나 관련 설정할 수 있다.
##__init__.py 예제
VERSION = 3.5 #이렇게 버전 등 공통 변수 정의

def print_version_info(): #이렇게 공통 함수 정의
	print(f'Version of thie game is {VERSION}') 

from .graphic.render import render_test 
#이렇게 다른 모듈을 미리 import해서, 해당 기능 더 간편하게 접근
#여기서 .은 디렉터리 구분. 특히 .graphic의 .은 현재 디렉터리 의미. 
#이 경우 import game만 해도 game.render_test()로 바로 사용 가능

print('Initializing game...') 
#이렇게 안내 문구 실행 => 하위 패키지까지 임포트하면 자동으로 실행
  • 패키지 안 함수 살행하기
    • import game.sound.echo => echo 모듈까지 실행
    • from game.sound import echo => echo 모듈까지 실행
    • from game.sound.echo import echo_test => echo_test 함수만 들고오기
    • from game.sound import *: game.sound 모듈의 (모든 것)을 import한다.
      이 경우 __init__.py 파일에 __all__ = ['echo']처럼
      로 사용 가능한 모듈들을 all변수에 집어넣어서 정의해준다.
    • import game \n game.sound.echo.echo_test() 이건 불가능. import game하면 game 디렉터리의 init.py에 정의한 것만 참조할 수 있다.
  • relative한 접근자
    • 디렉토리 설명하는데 .은 현재 디렉터리, .. 부모 디렉터리
      from ..sound.echo import echo_test: 현재 디렉토리가 graphic일 때, 하나 앞인 game으로 넘어가서, sound로 간다는 뜻.
profile
일본에서 일하는 게임 기획자. 시시해서 죽어버리지 않게, 재밌고 의미 있는 컨텐츠에 관심 있습니다. 그 도구로 데이터, AI도 찝적댑니다.

0개의 댓글