input, print 등의 내장 함수만으로는 복잡한 코드를 짜기엔 한계가 있어 파이썬의 random, turtle, pickle 등의 모듈과 패키지를 사용해야함.
import abc # abc가 모듈 또는 패키지
파일 이름과 import 되는 모듈명이 같을 경우 에러가 발생한다.
함수들이 뭉쳐진 하나의 .py 파일 안에 이루어진 것을 모듈이라 함.
즉 하나의 파일이 모듈이다.
참고. 한 권으로 끝내는 <파이썬 노트> 패키지와 모듈
모듈(파일)에서 함수의 이름만 import 해주면 짧은 코드 작성이 가능하다.
import sys
sys.path.append('C:/PyStudy')
#import mypack.calc.add
#mypack.calc.add.outadd(1, 2)
#코드 단순화
#from mypack.calc import add
#add.outadd(1, 2)
#함수의 이름만 import
from mypack.calc.add import outadd
outadd(1, 2)
여러 개의 모듈을 그룹화 하면 패키지가 됨. 디렉토리는 패키지로 정의 됨.
패키지는 종종 라이브러리라고도 불린다.
그룹화를 통한 쉬운 관리를 위해 패키지 사용을 권장한다.
import *
이라고 모든 모듈을 import 할 수 없다.모듈을 다 읽어 오려면 엄청난 시간이 걸리므로 불러올 모듈을 별도로 설정해야 함.
__init__.py
파일명은
___init__
로 생성해야 함.
__all__ = ['add', 'multi']
print('add module imported')
#usepackage
import sys
sys.path.append('C:/PyStudy')
from mypack.calc import *
add.outadd(1, 2)
multi.outmulti(2, 3)
sys.modules
bulit-in modules
sys.modules
다음으로 확인sys.path
str
요소를 가진 list
이다 (경로 표시 ./../)sys.modules
와 sys.path
출력 및 수정 가능ModuleNotFoundError
에러를 리턴한다.import sys
print('버전 : ', sys.version)
print('플랫폼 : ', sys.platform)
if sys.platform == 'win32' :
print(sys.getwindowsversion())
print('바이트 순서 : ', sys.byteorder)
print('모듈 경로 : ', sys.path)
sys.exit(0)
import sys
print(sys.argv)
sys.modules
와 sys.path
의 차이점
sys.modules
를 우선적으로 찾은 뒤sys.path
를 마지막으로 확인하는데 이때sys.path
에서도 못찾으면ModuleNotFoundError
에러가 난다.
sys
모듈의 위치를 찾는법
sys
도import
해야하는 모듈이기 때문에 파이썬이 찾아야하는데sys
의 경우 bulit-in module이라서 2번째 순서로 검색 후 찾은 다음import 할 수 있다.
- Absolute path는 이름 그대로 절대 경로이다. 프로젝트 내에서는 어느 파일, 어느 위치에서 import를 하는 파일이나 경로에 상관없이 항상 경로가 동일하기 때문
absolute path
를 사용하게 되면 경로가 길어질 수 있어 이러한 단점을 보완하기 위해서relative path
를 사용할 수 있다.Relative path
는absolute path
와 다르게 프로젝트의 최상단 디렉토리를 기준으로 경로를 잡는게 아니라 import 하는 위치를 기준으로 경로를 정의해서 일반적으로relative path
는 local package 안에서 다른local package
를 import 할때 사용Relative path
는 선언해야 하는 경로의 길이를 줄여준다는 장점은 있지만 헷갈리기 쉽고 파일 위치가 변경되면 경로 위치도 변경되어야 하는 단점이 있어 웬만한 경우 absolute path를 사용
calculator
패키지 만들기 연습main.py
# absoulte path
# from calculator.add_and_multiply import add_and_multiply
# relative path
from .calculator.add_and_multiply import add_and_multiply
if __name__ == '__main__':
print(add_and_multiply(1,2))
add_and_multiply.py
from .multiplication import multiply
# from calculator.multiplication import multiply
def add_and_multiply(a,b):
return multiply(a,b) + (a+b)
multiplication.py
def multiply(a,b):
return(a*b)
main.py
에서 상대경로로 add_and_mutiply
를 임포트 했을 때 에러 발생main.py
# absoulte path
# from calculator.add_and_multiply import add_and_multiply
# relative path
from .calculator.add_and_multiply import add_and_multiply
if __name__ == '__main__':
print(add_and_multiply(1,2))
# ImportError 발생
Traceback (most recent call last):
File "/home/hwang/dev/python/calculator_pratice/main.py", line 4, in <module>
from .calculator.add_and_multiply import add_and_multiply
ImportError: attempted relative import with no known parent package
__main__
으로 사용할 파일은 항상 absolute path로 지정해줘야 한다.
__main__
이란❓️ 처음 실행하는 소스 파일이 메인 모듈이다.
- 참고한 사이트
main.py
# absoulte path
from calculator.add_and_multiply import add_and_multiply
# relative path
# from .calculator.add_and_multiply import add_and_multiply
if __name__ == '__main__':
print(add_and_multiply(1,2))
=========================================================
/home/hwang/dev/python/calculator_pratice/main.py
5
add_and_multiply.py
에서 multiply
함수를 상대경로로 임포트 해보기add_and_multiply.py : relative path일때
# relative path
from .multiplication import multiply
# from calculator.multiplication import multiply
def add_and_multiply(a,b):
return multiply(a,b) + (a+b)
=========================================================
# ImportError 발생
Traceback (most recent call last):
File "/home/hwang/dev/python/calculator_pratice/calculator/add_and_multiply.py", line 1, in <module>
from .multiplication import multiply
ImportError: attempted relative import with no known parent package
발생한 에러
에러가 발생한 이유
add_and_multiply.py
파일의 부모 경로가 multiplication.py
로 잡혀있어 에러가 발생함해결 방법
참고한 사이트
add_and_multiply.py
에서 multiply
함수를 절대경로로 임포트 해보기add_and_multiply.py : absolute path일때
# from .multiplication import multiply
# absolute path
from calculator.multiplication import multiply
def add_and_multiply(a,b):
return multiply(a,b) + (a+b)
=========================================================
# ModuleNotFoundError 발생
Traceback (most recent call last):
File "/home/hwang/dev/python/calculator_pratice/calculator/add_and_multiply.py", line 2, in <module>
from calculator.multiplication import multiply
ModuleNotFoundError: No module named 'calculator'
add_and_multiply.py
파일을 실행 시켰을 경우 메인 파일이 된다. 파이썬 공식 문서에도 적혀있듯이 메인 파일은 절대경로를 사용해야함.add_and_multiply.py
파일에 import할 파일 multiplication.py
가 동일한 위치에 있기 때문에 파일 명만 적어주면 add_and_multiply.py
파일을 실행했을때 정상적으로 작동한다.add_and_multiply.py
와 multiplication.py
이 같은 위치에 있음)add_and_multiply.py
# from .multiplication import multiply
from multiplication import multiply # 절대경로
def add_and_multiply(a, b):
return multiply(a, b) + (a+b)
print(add_and_multiply(4, 10))
=================================================
> 54
참고한 사이트
__init__.py
파일의 역할__init__.py
파일에는 아무코드도 없지만 init 파일은 해당 디렉토리가 패키지임을 알려주는 역할을 한다.