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.modulesbulit-in modulessys.modules 다음으로 확인sys.pathstr 요소를 가진 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 파일은 해당 디렉토리가 패키지임을 알려주는 역할을 한다.