1. Module

  • 함수, 변수, 클래스 등 파이썬 구성요소 등을 모아놓은 파일
  • 다른 파이썬 프로그램에서 가져와서(import) 재사용하기 쉽도록 만든 파이썬 파일

2. Module 불러오기 (import)

  • 현재 directory에 있는 파일이나 파이썬 라이브러리가 저장된 directory에 있는 module만 불러올 수 있다 (파이썬 라이브러리는 파이썬을 설치할 때 자동으로 설치되는 파이썬 모듈을 의미)
  • 모듈이름은 ${모듈이름}.py에서 .py 확장자를 제거한 모듈이름만 써준다
import ${모듈이름}

example)

# module1.py
def add(a, b):
    return a + b

def sub(a, b):
    return a - b
import module1

print(module1.add(2, 5))  # 7


  • 모듈이름 없이 함수 이름만 쓰고 싶은 경우에는 아래와 같이 from ~ import ~ 구문을 써준다
    • ex) module1.add 대신 add만 쓰고 싶은 경우!
from ${모듈이름} import ${모듈함수}

example)

from module1 import add

add(2, 5)  # 7


3. if __name__ == "__main__"

# module1.py
def add(a, b):
    return a + b

def sub(a, b):
    return a - b

print(add(2, 3))
print(sub(4, 2))

위 파이썬 파일을 터미널 창에서 바로 실행시킨다면 아래와 같은 출력화면이 뜬다.

--------------------------------------------------
/Users/jinsolkim/Desktop/math>python module1.py
5
2

1) Problem

그런데 이 module1.py 파일의 addsub 함수를 사용하기 위해 module1 모듈을 import할 때도 5와 2가 같이 출력된다.

/Users/jinsolkim/Desktop/math>python
Python 3.9.13 | packaged by conda-forge | (main, May 27 2022, 17:00:33)
[Clang 13.0.1 ] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> import module1
5
2

2) Solution

import module1을 수행하는 순간 module1.py가 실행되어 결과값을 출력하는 것이다. 이러한 문제를 방지하기 위해 써주는 것이 if __name__ == "__main__" 이다.

# module1.py 
def add(a, b): 
    return a + b

def sub(a, b): 
    return a - b

if __name__ == "__main__":
    '''
    이 부분에 코드를 추가하는 이유:
    이 파일을 개발하면서 타인 또는 자신이 나중에 본 파일을 직접 실행시켰을 때 참고할 테스트를 작성해 놓는 것
    즉, 개발 중 이해를 돕기 위해 작성하는 부분
    '''
    print(add(2, 3))
    print(sub(4, 2))

3) Summary

  • if __name__ == "__main__"을 사용하면
    • /Users/jinsolkim/Desktop/math>python module1처럼 파이썬 파일을 직접 실행할 경우 → module1.py의 __name__ 변수에 __main__ 값이 저장된다
      • 즉, __main__ 키워드는 실행되는 대상 파일을 나타낸다
    • python shell이나 다른 파이썬 모듈에서 import module1을 할 경우 → module1.py의 __name__ 변수에 module1.py의 모듈 이름 값인 module1이 저장된다


3. Module 불러오기 원리 이해

  • 위의 #2에서는 모듈을 사용하기 위해 모듈이 위치하고 있는 directory로 이동해서 모듈을 import하여 사용하였다.
  • 하지만 module을 불러오는 원리를 이해하고 있다면, 모듈을 저장한 directory로 이동하지 않고 모듈을 불러오는 방법을 사용할 수 있다.

1) sys.path.append()

import sys

print(sys.path)
------------------------------------------------------------
['/Users/jinsolkim/Desktop/project/project2',
 '/Users/jinsolkim/.vscode/extensions/ms-toolsai.jupyter-2022.6.1201981810/pythonFiles',
 '/Users/jinsolkim/.vscode/extensions/ms-toolsai.jupyter-2022.6.1201981810/pythonFiles/lib/python',
 '/Users/jinsolkim/miniforge3/envs/practice/lib/python38.zip',
 '/Users/jinsolkim/miniforge3/envs/practice/lib/python3.8',
 '/Users/jinsolkim/miniforge3/envs/practice/lib/python3.8/lib-dynload',
 '',
 '/Users/jinsolkim/miniforge3/envs/practice/lib/python3.8/site-packages']
  • sys 모듈: 파이썬 설치 시 함께 설치되는 라이브러리 모듈
  • sys.path
    • 파이썬 라이브러리가 설치되어 있는 directory를 보여준다
    • 만약 파이썬 모듈이 위 directory에 들어있다면 모듈이 저장된 directory로 이동할 필요 없이 바로 불러서 사용 가능
    • 필요한 모듈을 sys.path로 출력되는 list의 directory에 추가해준다면 해당 모듈을 어디서든 사용 가능
  • sys.path.append(${모듈을 저장한 directory})
sys.path.append('/Users/jinsolkim/Desktop/math')
sys.path
------------------------------------------------------------
['/Users/jinsolkim/Desktop/project/project2',
 '/Users/jinsolkim/.vscode/extensions/ms-toolsai.jupyter-2022.6.1201981810/pythonFiles',
 '/Users/jinsolkim/.vscode/extensions/ms-toolsai.jupyter-2022.6.1201981810/pythonFiles/lib/python',
 '/Users/jinsolkim/miniforge3/envs/practice/lib/python38.zip',
 '/Users/jinsolkim/miniforge3/envs/practice/lib/python3.8',
 '/Users/jinsolkim/miniforge3/envs/practice/lib/python3.8/lib-dynload',
 '',
 '/Users/jinsolkim/miniforge3/envs/practice/lib/python3.8/site-packages',
 '/Users/jinsolkim/Desktop/math']
  • 마지막 줄에 '/Users/jinsolkim/Desktop/math'이 추가된 것을 확인할 수 있다. 이제 어디서든 모듈을 불러와 사용할 수 있다.
import module1

print(module1.add(2, 5))  # 7


2) PYTHONPATH 환경변수 사용

  • sys.path.append 코드는 영구적으로 등록하는 것이 아니라 이 파일을 실행시킬 때만 적용되는 것! 임시방편!
  • python path에 영구적으로 등록하기 위해서는 환경변수에 있는 PYTHONPATH에 경로를 추가해 놓아야 한다
/Users/jinsolkim/Desktop/math>set PYTHONPATH=/Users/jinsolkim/Desktop/math/module1
import module1

print(module1.add(2, 5))  # 7


Reference


Leave a comment