sys 모듈이란? :
파이썬 sys 모듈은 파이썬 런타임 환경의 다양한 부분을 변경할 수 있는 함수와 변수로 이루어져있다. 짧게 말해, sys 모듈은 파이썬 인터프리터가 제공하는 변수와 함수를 직접 제어할 수 있게 해주는 모듈이다.
아래 이미지는 dir() 함수를 써서 sys 모듈 내에 정의된 모든 attribute 요소를 문자열과 리스트 형태로 출력한 결과이다. 어트리뷰트의 종류와 수가 엄청 많다는 것이 확인된다.
sys.modules 란? :
sys.modules은 앞선 최상위 sys 모듈에서 정의된 수 많은 attribute 중 하나이다. 위 캡처한 이미지 파일 중후반 쯤에서 찾아 볼 수 있다.
주요 기능으로, 이미 한 번 이상 import가 된 모듈을 해당 모듈명을 활용하여 (동시에, dictionary상 기능을 이용하여) 찾는 역할을 한다. 한 번 이상 사용되었거나 이미 내장 되어 있는 module이나 패키지만 존재하므로 새롭게 import 되는 것은 없다고 볼 수 있다.
sys.modules 상 저장된 {'키':'값'} 딕셔너리 형식의 수 많은 모듈들
어떤 한 모듈이 파이썬 파일상에서 import가 되면, 파이썬 인터프리터는 가장먼저 해당 모듈을 빌트인 모듈에서 찾는다. 발견 실패시, sys.path에서 정의된 디렉토리 리스트에서 찾게 된다.
sys.path가 품고 있는 디렉토리 주소 출력결과
sys.path 모듈 내에 정의된 많은 메소드 함수들
'Import'를 통해 파일과 모듈에 접근하기 까지 아래의 여러 과정을 거친다.
(1) 이전에 이미 import된 코드가 있는지 확인차 sys.modules에서 모듈/패키지를 탐색하고,
(2) 그 후에 파이썬 표준 라이브러리를 검색한다.
(3) 만약 원하는 모듈을 찾지 못하면, 전체 저장공간을 훑는 과정을 거치는데 이때, 현재 디렉토리에서 부터 system.path에 리스팅되어 있는 디렉토리까지 포함된다.
(4) 만약 모듈이 그 과정속에서 발견된다면 프로그램에 해당 모듈을 추가하고 그렇지 않다면 ModuleNotFoundError라는 메세지가 뜨게 된다.
Aboslute Import(절대경로를 통한 Import):
Relative Import(상대경로를 통한 Import):
Absolute vs Relative:
- 여러 층의 패키지로 이루어진 거대한 프로젝트에 투입된게 아니라면, absolute import를 사용하는 습관을 들여야 한다. 그로써 다른 개발자들의 이해를 도울뿐만 아니라 팀 전체의 개발 효율도 높아진다.
multiply.py
라는 간단한 곱셈 함수 역할을 하는 파이썬 파일을 만든다
위 곱셈함수를 같은 폴더 내에서(.multiply
: 현재 폴더에 위치한 multiply 파이썬 파일 이란 뜻) 호출하고 덧셈 속성을 추가하는 add_and_multiply.py
를 만든다
main.py
에서 상대경로를 이용하여 add_and_multiply 함수를 실행시켜 보았으나 실패함. 그 사유는, 상대경로는 현재 모듈을 기준으로 모듈/패키지를 찾기 때문에, main 모듈은 항상 메인이라서 반드시 절대 경로를 사용해야 정상 작동하기 때문이다.
위 에러를 아래와 같이 절대경로로 수정하여 성공적으로 실행함. 입력 값(5,9)을 서로 곱한 값에 서로 더한 값을 더한 최종결과(59)를 성공적으로 반환함.
__init__.py
파일에는 아무코드도 없지만 init 파일은 해당 디렉토리가 패키지임을 알려주는 역할을 한다.
- 패키지에는 init.py 라는 특별한 파일이 있는데, 이 파일은 기본적으로 그 폴더가 일반 폴더가 아닌 패키지임을 표시하기 위해 사용될 뿐만 아니라, 패키지를 초기화하는 파이썬 코드를 넣을 수 있다. 버젼 3.3 이상에서는 이 파일이 없어도 패키지로 사용할 수 있지만, 호환성을 위해 두는 것이 좋다. init.py 파일에서 중요한 변수로 all 이라는 리스트 변수가 있는데, 이 변수는 "from 패키지명 import *" 문을 사용할 때, 그 패키지 내에서 import 가능한 모듈들의 리스트를 담고 있다. 즉, all 에 없는 모듈은 import 되지 않고 에러가 발생한다.
(설명 출처: http://pythonstudy.xyz/python/article/18-패키지)
__init__.py
의 예시: