프로그램이 커지고, 관리해야할 코드들이 늘어난다면, 이들을 여러개의 파일로 분산시켜 관리하는 것이 편리할 것이다. 이를 위해 module이 존재한다. 자주 쓰이는 함수 / 클래스 / 변수 등을 다른 파일(모듈)에 저장하고, 필요할 때마다 import해서 사용한다.
import calculation
num1 = 4
num2 = 8
print(multiply(num1, num2))
app.py 파일에 저 코드가 전부라고 해보자. 눈 씻고 찾아봐도 multiply라는 함수는 정의되어 있지 않다. 하지만 calculate라는 파일을 import했고, calculate.py에 multiply가 있다면 위 코드는 실행될 것이다.
모듈을 import했으면, 이제 파이썬은 모듈이 저장된 위치를 찾을 것이다. 파이썬은 sys.modules ⇨ built-in modules ⇨ sys.path 의 순서로 모듈의 위치를 찾는다.
한 번 import된 모듈과 패키지들은 sys.modules에 저장되어, 새로 찾을 필요가 없도록 관리한다. 처음으로 import하는 모듈은 sys.modules에서 찾을 수 없다.
파이썬에서 제공하는 공식 라이브러리들로, 이미 파이썬에 포함되어 있으므로 쉽게 찾을 수 있다.
sys.modules와 built-in modules에 있는 모듈은 쉽게 찾을 수 있지만, 새로 import하면서 built-in module이 아닌 모듈들은 저장소의 경로를 string으로 가지고 있는 list- sys.path -에서 찾는다.
위의 예시 코드에서, app.py는 /home/python_project에 저장되어있고, calculation.py는 /home/python_functions에 저장되어있다면, 다음과 같은 방법으로 sys 역시 import해야한다.
import sys
sys.path.append('/home/python_functions')
import calculation
num1 = 4
num2 = 8
print(multiply(num1, num2)
먼저, 파이썬 파일들이 다음과 같이 저장되어 있다고 하자.
project
├── main.py
├── package1
│ ├── module1.py
│ └── module2.py
└── package2
├── __init__.py
├── module3.py
└── sub_package1
└── module4.py
Absolute path란 이름 그대로 '절대 경로'라는 뜻이다. 현재 작업을 하고 있는 프로그램의 이름이 main.py이면, 다음과 같은 방법으로 import 할 수 있다.
from package1 import module1
from package2.module2 import function1
from package2.sub_package1 import module4
최상위 디렉토리는 언제나 project이고(main.py가 project폴더에 있으므로 생략), project 내에서 모든 파일은 동일한 방식으로 import되기 때문에 절대 경로라고 부른다.
Relative path는 absolute path와는 달리, 최상단 디렉토리를 기준으로 경로를 잡지 않는다. 대신, import하는 위치를 기준으로 경로를 정한다. 만약 module3에서 module1의 class1을 import하고싶다면, 다음과 같은 방법으로 할 수 있다.
<!--module3의 상위 디렉토리에 있는 module1에서 class1을 imort하라-->
from ..module1 import class1
패키지는 모듈을 계층적으로 관리할 수 있게 해준다. 앞서 모듈이 큰 파이썬 파일을 나누어서 관리하기 위해 존재한다고 했는데, 이러한 모듈 역시 너무 크다면 한 파일에 넣기에 비효율적일 수 있다. 이런 경우 모듈 역시 여러 파일에 나누어서 코드를 관리하는데, 이렇게 나뉜 코드들도 하나의 모듈처럼 사용할 수 있도록 하는 것이 패키지이다.
project
├── main.py
├── package1
│ ├── module1.py
│ └── module2.py
└── package2
├── __init__.py
├── module3.py
└── sub_package1
└── module4.py
아까 사용했던 이 예시를 다시 보면, 모듈들을 담고 있는 상위 디렉토리가 패키지이고, 그 디렉토리의 이름이 패키지의 이름이 된다.
__init__.py 파일은 패키지의 초기 설정을 가능하게 해준다(python3.3 버전부터는 __init__ 파일이 없어도 패키지로 인식). 패키지 안에 동 파일이 있으면 패키지가 import될 때 파일 내의 코드들이 자동으로 실행된다. 여기에는 다음과 같은 이점이 있다.
🔹 Import시 입력해야하는 경로의 총 길이 단축
🔹 패키지에서 import할 수 있는 함수 / 클래스 / 변수 제한
🔹 패키지가 import될 때 먼저 실행되어야 하는 코드들 설정 가능