Python - Module(1)

Nina·2020년 9월 19일
0

Python

목록 보기
2/6
post-thumbnail

1. Module?

프로그램이 커지고, 관리해야할 코드들이 늘어난다면, 이들을 여러개의 파일로 분산시켜 관리하는 것이 편리할 것이다. 이를 위해 module이 존재한다. 자주 쓰이는 함수 / 클래스 / 변수 등을 다른 파일(모듈)에 저장하고, 필요할 때마다 import해서 사용한다.

import calculation
num1 = 4
num2 = 8
print(multiply(num1, num2))

app.py 파일에 저 코드가 전부라고 해보자. 눈 씻고 찾아봐도 multiply라는 함수는 정의되어 있지 않다. 하지만 calculate라는 파일을 import했고, calculate.py에 multiply가 있다면 위 코드는 실행될 것이다.

2. Finding Modules(모듈을 찾아서🐠)

모듈을 import했으면, 이제 파이썬은 모듈이 저장된 위치를 찾을 것이다. 파이썬은 sys.modules ⇨ built-in modules ⇨ sys.path 의 순서로 모듈의 위치를 찾는다.

(1) 모듈을 찾는 순서

➀ sys.modules

한 번 import된 모듈과 패키지들은 sys.modules에 저장되어, 새로 찾을 필요가 없도록 관리한다. 처음으로 import하는 모듈은 sys.modules에서 찾을 수 없다.

➁ built-in modules

파이썬에서 제공하는 공식 라이브러리들로, 이미 파이썬에 포함되어 있으므로 쉽게 찾을 수 있다.

➂ sys.path

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)

(2) Absolute path와 relative path

먼저, 파이썬 파일들이 다음과 같이 저장되어 있다고 하자.

   project
        ├── main.py
        ├── package1
        │   ├── module1.py
        │   └── module2.py
        └── package2
            ├── __init__.py
            ├── module3.py
            └── sub_package1
                └── module4.py

➀ Absolute Path

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

Relative path는 absolute path와는 달리, 최상단 디렉토리를 기준으로 경로를 잡지 않는다. 대신, import하는 위치를 기준으로 경로를 정한다. 만약 module3에서 module1의 class1을 import하고싶다면, 다음과 같은 방법으로 할 수 있다.

<!--module3의 상위 디렉토리에 있는 module1에서 class1을 imort하라-->
from ..module1 import class1

3. Package & __init__.py

(1) Package

패키지는 모듈을 계층적으로 관리할 수 있게 해준다. 앞서 모듈이 큰 파이썬 파일을 나누어서 관리하기 위해 존재한다고 했는데, 이러한 모듈 역시 너무 크다면 한 파일에 넣기에 비효율적일 수 있다. 이런 경우 모듈 역시 여러 파일에 나누어서 코드를 관리하는데, 이렇게 나뉜 코드들도 하나의 모듈처럼 사용할 수 있도록 하는 것이 패키지이다.

   project
        ├── main.py
        ├── package1
        │   ├── module1.py
        │   └── module2.py
        └── package2
            ├── __init__.py
            ├── module3.py
            └── sub_package1
                └── module4.py

아까 사용했던 이 예시를 다시 보면, 모듈들을 담고 있는 상위 디렉토리가 패키지이고, 그 디렉토리의 이름이 패키지의 이름이 된다.

(2)__init__.py

__init__.py 파일은 패키지의 초기 설정을 가능하게 해준다(python3.3 버전부터는 __init__ 파일이 없어도 패키지로 인식). 패키지 안에 동 파일이 있으면 패키지가 import될 때 파일 내의 코드들이 자동으로 실행된다. 여기에는 다음과 같은 이점이 있다.

🔹 Import시 입력해야하는 경로의 총 길이 단축
🔹 패키지에서 import할 수 있는 함수 / 클래스 / 변수 제한
🔹 패키지가 import될 때 먼저 실행되어야 하는 코드들 설정 가능

profile
https://dev.to/ninahwang

0개의 댓글