공부 내용을 정리하는 목적 이므로 참고용으로만 읽어 주시기 바랍니다. 틀린 부분에 대한 지적은 감사합니다. |
1. 모듈(module)이란?
파이썬 인터프리터를 사용할 경우 프로그램 종료시 코드들이 사라지지만 모듈(module)은 함수, 변수 클래스 또는 실행코드들을 논리적으로 하나로 묶어서 관리하고 사용할 수 있도록 텍스트형식으로 만들어 놓은 파일이다. 모듈은 다른 파이썬 프로그램에서 불러서 사용할 수 있으며 *.py 확장자를 이용하여 만들어진 파일이다. 또한 우리가 자주 사용하는 다른 사람들에 의해서 만들어진 라이브러리들 또한 모듈이라고 한다.
이 2개의 함수를 mod_test.py라는 파일로 저장하게 된다면 mod_test라는 모듈이 되는 것이고 해당 모듈을 사용하면 언제든지 add과 mul이라는 함수를 모듈에서 가져와 사용할 수 있게 된다.
2. import
앞에서 생성한 mod_test.py 라는 모듈을 불러와 사용하는 방법은 import를 사용한다. import는 이미 만들어 놓은 파이썬 모듈을 사용할 수 있게 해주는 명령어이다. import는 현재 디렉터리에 있는 파일이나 기본적으로 주어지는 파이썬 라이브러리가 저장된 디렉터리에 있는 모듈을 불러오는 경우 경로를 입력하지 않고 모듈명만 작성하면 되지만 그렇지 않을 경우 경로를 전부 입력한다.
문법)
import 모듈이 존재하는 경로와 모듈명(ex. C:\Python\Study\mod_test)
해당 예시의 경우 mod_test라는 사용자가 생성한 모듈을 import하는 study 라는 파일과 같은 디렉토리에 있으므로 import시 따로 경로를 지정하지 않는다. 또한 모듈을 불러왔으므로 따로 함수를 생성하지 않아도 mod_test 모듈에 생성된 함수를 (.) 도트 연산자를 통해 사용할 수 있다.
만일 따로 도트 연산자를 사용하지 않고 동일 프로그램내에 생성한 함수처럼 함수명으로만 동작 시키고 싶다면
문법)
from 모듈명 import 함수1 또는 클래스1, 함수2 또는 클래스2, ..
from 모듈명 import *
해당 문법을 통해 import 시키면 된다. 해당 모듈에 있는 함수또는 클래스를 import 시킨다 라고 이해하면 되며 (,) 를 통해 가지고올 함수나 클래스를 여러개 가져올 수 있다.
*은 정규표현식의 뜻과 동일하게 전부를 뜻하므로 해당 모듈이 가진 모든걸 가져온다고 생각하면 된다.
2가지 import 방법모두 동일한 결과를 출력할 수 있다.
3. 모듈을 찾는 과정
import를 통해 내장된 라이브러리나 직접 생성한 모듈을 불러올수 있는대 import를 통해 모듈을 불러오게 되면 파이썬은 다음과 같은 경로를 차례로 검색하여 모듈을 찾게된다.
① 현재 프로그램이 실행되는 디렉토리
하나의 패키지에서 자주 사용되는 모듈은 되도록 같은 디렉토리에 작성하여 위의 예시 처럼 import를 편하게 사용한다
② 환경변수 PYTHONPATH에 지정된 경로
해당 과정은 시스템의 파이썬 컴파일러가 기본적으로 참조하는 모듈에 자신이 만든 모듈이나 가져온 모듈을 추가하는 방법이다.
제어판->시스템->고급->환경변수->PYTHON_PATH 편집->자신의 프로젝트 디렉토리 맨뒤에 추가
③ 파이썬이 설치된 경로 및 라이브러리 경로
내장 모듈인 경우 파이썬은 이미 어떤 경로에 모듈이 있는지 알고 있기 때문에 쉽게 찾을수 있다. 이 경로라는 건 sys 모듈의 path변수에 리스트 형태로 저장되어 있다. 따라서 여러 프로그램에서 내장 모듈이 아닌 직접 만들거나, 다른사람이 만들어 놓은 라이브러리를 여러개 사용하는 경우 일일이 복사해서 현재 디렉토리에 옮기는 것이 아니라 sys.path 변수에 경로를 추가하여 사용한다. 그럼 파이썬이 해당 sys.path에 저장된 경로를 검색하여 해당 모듈을 찾게되면 모듈 내부에 있는 명령들을 읽어올 수 있게 된다.
이런 식으로 현재 자신의 프로젝트의 디렉토리를 추가하면 된다.
4. __name__ 과 __main__
만일 위와 같은 경우 해당 함수나 클래스의 동작여부를 확인하기 위해 .py 파일을 에디터를 통해 컴파일을 진행하고 실행할경우 확인하는 코드 print(add(1,2))등을 변경하고 다시 실행하면 되기 때문에 모듈에 있는 기능을 실행하는대 전혀 문제가 없지만 만일 인터프리터로 해당 모듈을 import 할 경우 print가 바로 실행되고 원하는 인수로 함수를 확인하지 못한다. 해당 문제를 해결 하려면 조건문을 추가하면 된다.
이유는 __name__ 변수와 __main__ 변수 때문이다. 파이썬의 __name__ 변수는 파이썬 내부에서 사용하는 특별한 변수 이다. 만약 직접 mod_test.py 파일을 에디터 등에서 실행할 경우 mod_test.py의 __name__ 변수에는 __main__ 이라는 문자열값이 저장된다. 하지만 파이썬 셸이나 다른 파이썬 모듈에서 mod_test을 import 할 경우에는 mod_test.py의 __name__ 변수에는 mod_test.py라는 이름이 저장된다. 따라서 if __name__ == "__main__"을 사용하면 직접 이 파일을 실행했을 때는 __name__ == "__main__"이 참이 되어 if문 다음 문장이 수행된다. 반대로 대화형 인터프리터나 다른 파일에서 이 모듈을 불러서 사용할 때는 __name__ == "__main__"이 거짓이 되어 if문 다음 문장이 수행되지 않아 모듈에 있는 기능을 원하는 인수를 통해 확인할 수 있다.
'언어 > Python' 카테고리의 다른 글
[Python 기본 공부정리] 11. 예외 처리 (0) | 2020.01.05 |
---|---|
[Python 기본 공부정리] 10. 패키지(package) (0) | 2020.01.04 |
[Python 기본 공부정리] 8-4. 클래스 - 객체 변수(object variable), 클래스 변수(class variable) (0) | 2020.01.02 |
[Python 기본 공부정리] 8-3. 클래스 - 상속(inheritance) (0) | 2020.01.01 |
[Python 기본 공부정리] 8-2. 클래스 - 생성자(constructor) (0) | 2019.12.30 |
댓글