module?
파이썬에서 모듈은 변수, 함수, 클래스 등을 모아놓은 파일이다. 매번 변수, 함수, 클래스 등을 선언할 필요 없이 모듈을 import해오면 바로 사용할 수 있어 편리하다. 모듈을 사용하면 코드가 너무 길어지는 것 또한 막을 수 있다.
len()
같은 파이썬 내장 모듈이 있고, 사용자가 직접 만들 수도 있다.
module 만드는 법
모듈명.py
파일 안에 재사용 하고싶은 변수, 함수, 클래스 등을 선언한다. 한 파일 안에서 여러 종류 요소를 여러 개 선언할 수 있다.
module 사용하는 법
모듈을 쓰고자 할 때 import
로 해당 모듈을 끌어온다. 이때 모듈명에서 확장자 .py
는 쓰지 않는다.
import 모듈명
또는
from 모듈명 import 변수 또는 함수 또는 클래스명
또는
from 모듈명 import *
*
는 모듈 파일 안 전체 내용을 끌어오는 것을 의미한다.
다른 모듈이지만 요소 이름이 같을 수 있기 때문에 import 하면서 요소 이름을 바꿔서 가져오는 것도 가능하다.
from 모듈명 import 변수 또는 함수 또는 클래스명 as 새 이름
물론 모듈 이름을 바꿔서 가져올 수도 있다.
import 모듈명 as 새 이름
package?
패키지는 모듈을 모아놓은 묶음, 일종의 폴더다. 한 모듈 안에 모든 코드를 넣을 수 없을 경우 여러 파일로 분산해서 관리하는데, 이렇게 나눠진 모듈도 한 곳에서 사용할 수 있도록 해주는 것이 패키지다.
package 사용하는 법
import 패키지명.파일명
또는
from 패키지명.파일명 import 변수 또는 함수 또는 클래스명
이렇게 패키지를 불러온 뒤,
패키지명.파일명.변수 또는 함수 또는 클래스명
변수 또는 함수 또는 클래스명
이렇게 실행한다.
패키지를 import할 때 초기 설정을 해줘야 할 때가 있다. 그럴 땐 패키지 폴더 안에 __init__.py
파일을 통해 패키지 초기 설정을 한다.
init.py 파일의 역할
python 3.2 이전 버전에서는 __init__.py
파일이 해당 폴더가 패키지임을 알려주는 역할을 했다. python 3.3 이상부터 __init__.py
파일이 없어도 패키지로 인식한다. 하지만 하위 버전과 호환을 위해 __init__.py
파일을 작성하는 것을 권장한다.
패키지 폴더 안에 __init__.py
파일이 있으면 패키지가 import될 때 __init__.py
파일 내 코드가 자동으로 실행된다.
__init__.py
파일의 역할은 아래와 같다.
- import할 때 경로 길이를 줄여준다.
- 패키지 외부에서 import할 수 있는 변수/함수/클래스를 제한할 수 있다.
- 패키지가 import될 때 먼저 실행되어야 하는 코드를 지정할 수 있다.
예시와 함께 자세한 내용을 살펴보자.
- import할 때 경로 길이를 줄여준다.
package1
이라는 패키지 안 module1
모듈에서 func1()
함수를 꺼내 쓴다고 가정해보자.
import package1
package1.module1.func1()
해당 함수를 쓸 때마다 패키지 - 모듈 - 함수 이름 순으로 불러와야 한다. 이때 __init__.py
를 사용하면 경로를 단축해서 쓸 수 있다.
# __init__.py
from .module1 import func1()
이렇게 __init__.py
파일에 func1()
을 import 하면,
from package1 import func1
func1()
훨씬 간결하게 func1()
을 호출할 수 있다.
- 패키지 외부에서 import할 수 있는 변수/함수/클래스를 제한할 수 있다.
패키지 외부에서 import 하면 안 되는 변수/함수/클래스를 __init__.py
파일에 지정할 수 있다.
package2
의 module2
안 func2
와 module3
안 func3
라는 함수만 패키지 외부로 끌어오고 싶은 경우를 가정해보자.
# __init__.py
from .module2 import func2
from .module3 import func3
__all__ = ['func2', 'func3']
__all__
변수는 기본적으로 모듈 안 모든 변수/함수/클래스를 string list 형태로 가지고 있다. 만약 일부 변수/함수/클래스만 가져와야 한다면 그것을 __all__
리스트 안에 넣어주면 된다.
__init__.py
파일에 이렇게 작성한 후 func2
, func3
외 다른 변수/함수/클래스를 import 한다면 아래와 같은 에러 메시지가 뜬다.
from package2 import *
func2()
func3()
func4()
- 패키지가 import될 때 먼저 실행되어야 하는 코드를 지정할 수 있다.
module4
안에 함수 func4()
부터 func10()
까지 있다고 가정해보자.
# __init__.py
from .module4 import func4, func5, func6
이렇게 어떤 변수/함수/클래스를 어떤 순서로 import할지 __init__.py
파일에서 지정할 수 있다.
sys.module와 sys.path의 차이
미리 지정된 모듈을 끌어와서 쓴다는 이야기는 파이썬이 모듈을 어딘가에 저장해놓았다는 의미다. 파이썬이 사용자가 import한 모듈을 찾는 과정은 다음과 같다.
- sys.modules 확인
- built-in modules 확인
- sys.path 확인
sys.modules는 한 번이라도 import된 모듈과 패키지를 저장하고 있다. 즉, 한 번도 import한 적 없는 모듈, 패키지는 sys.modules에 없다. 요소를 dictionary 형태로 저장하고 있다.
built-in modules는 파이썬에 기본으로 달려있는 공식 라이브러리다.
sys.path는 경로를 나타내는 string을 list 형태로 저장하고 있다. 사용자가 import한 모듈이 sys.modules
에도 없고 built-in module
에도 없을 때 sys.path에 저장된 경로를 훑으면서 모듈을 찾는다. 만약 sys.path에서도 모듈을 못 찾을 경우 ModuleNotFoundError
가 발생한다.
Python이 sys module을 찾는 과정
sys 또한 모듈의 하나다. 어떤 파이썬 버전이든 파이썬이 설치되어있기만 하다면 sys 모듈을 import할 수 있다. 즉, sys 모듈은 파이썬 기본 내장 모듈인 built-in modules라는 의미다.
위에서 sys.modules를 호출하기 위해 import sys
를 했더니 딕셔너리 첫 번째 요소가 'sys': <module 'sys' (built-in)>
인 것을 확인할 수 있다. 괄호 안에 built-in 모듈인 것도 명시해놨다.
따라서 파이썬은 앞으로 나의 로컬에서 sys 모듈을 sys.modules
에서 찾을 것이다.
absolute path와 relative path
사용자가 직접 만든 패키지나 모듈을 import할 때에는 해당 디렉토리 또는 파일이 있는 경로를 직접 지정해야 한다.
절대경로(absolute path)는 어떤 디렉토리나 파일이 있는 고유한 위치다. 예를 들어 python이라는 프로젝트 디렉토리 안에 있는 package1의 절대 경로는 python.package1
이다. package1 안에 있는 module1.py 파일의 절대 경로는 python.package1.module1
이다.
from package1.module1 import func1
현재 프로젝트 디렉토리는 자동으로 경로에 포함되기 때문에 절대경로에 지정해주지 않아도 된다.
상대경로(relative path)는 import할 특정 디렉토리나 파일을 기준으로 표시한 위치다. 일반적으로 relative path는 한 로컬 패키지 디렉토리 안에서 다른 로컬 패키지를 import할 때 사용한다.
하나의 프로젝트 디렉토리 안에 package2 패키지와 package3 패키지가 있다고 가정해보자. 이때 package2의 module2에서 package3의 module3을 import해서 func3를 사용하려고 한다면,
# package2/module2.py
from ..package3.module3 import func3()
상대경로는 경로를 짧게 쓸 수 있지만, 현재 위치한 디렉토리가 어디인지, 내가 필요한 모듈이 현재 위치를 기준으로 어디에 있는지 헷갈릴 수 있다. 또한 패키지나 모듈의 위치가 바뀌었을 때 다시 선언해주어야 하는 단점이 있다.