__init__.py
파일에는 아무코드도 없다. init 파일은 해당 디렉토리가 패키지임을 알려주는 역할을 한다.
ㄴ calculator
ㄴ __init__.py
ㄴ add_and_multiply.py
ㄴ multiplication.py
ㄴ main.py
# absolute 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))
from .multiplication import multiply
# from calculator.multiplication import multiply
def add_and_multiply(a, b):
return multiply(a, b) + (a + b)
def multiply(a, b):
return (a * b)
# 에러코드
ImportError: attempted relative import with no known parent package
relative path(상대 경로) 는 모듈 안에서만 사용해야 한다. 일반적으로 local package 안에서 다른 local package를 import 할때 사용된다.
You can also write relative imports, with the from module import name form of import statement. These imports use leading dots to indicate the current and parent packages involved in the relative import. - 파이썬 공식 문서 中..
-> main.py 에서는 absolute path(절대 경로)로 패키지의 모듈을 임포트 해야 한다.
add_and_multiply.py 의 절대경로와 상대경로 모두 정상적으로 출력된다.
add_and_multiply.py 는 패키지 안에 들어있는 모듈이기 때문에 절대경로와 상대경로 모두 실행되며, main.py는 패키지 안에 들어있지 않기 때문에 상대경로는 실행이 안되고 절대경로만 실행이 된다.
해당 디렉토리가 패키지의 일부임을 알려주는 역할을 한다. python3.3 버전부터는 __init__.py
가 없어도 패키지로 인식한다. 하지만 하위호환을 위해 생성하는 것이 안전하다.
특정 디렉토리의 모듈 전체를 불러 오고 싶을때 * 을 사용하면 오류가 발생한다.
from calculator import *
if __name__ == '__main__':
print(add_and_multiply(1, 2))
# 실행하면 오류 발생
NameError: name 'add_and_multiply' is not defined
특정 디렉토리의 모듈을 * 을 사용하여 import 할 때는 다음과 같이 해당 디렉토리의 __init__.py
에 __all__
변수를 설정하여 불러오고 싶은 모듈을 정의해주어야 한다.
# __init__.py
__all__ = ['add_and_multiply']
# * 실행
from calculator import *
if __name__ == '__main__':
print(add_and_multiply.add_and_multiply(1, 2))
정상적으로 실행된다.
공부한 내용과 다른 답들이 많아 혼란스러웠는데 다솜님 정리글 보고
깔끔하게 해당 문제 다시 정리할 수 있었습니다.
감사합니다 :)