[PYTHON]module/package import

박민하·2022년 5월 30일
0

PYTHON

목록 보기
8/11

1. sys.modules 와 sys.path의 차이점은?

  sys.modules 은 모듈/패키지를 찾을 때 가장 먼저 찾는 곳이다. Dictionary 형태로 저장되어 있으며, 한번 import된 모듈/패키지들은 파이썬이 또 다시 찾지 않아도 되도록 기억하고 있다.
sys.path는 은 모듈/패키지를 찾을 때 가장 마지막으로 찾는 곳이다. List 형태로 저장되어 있으며, 각 경로를 하나 하나 확인하면서 해당 경로에 import 하고자 하는 모듈/패키지가 있는지 확인한다. sys.path의 경로를 수정할 수도 있으며, 문자열과 바이트만 사용 가능하다.

2. sys 도 import 해야하는 모듈이다. 파이썬은 sys 모듈의 위치를 어떻게 찾을까?

  sys 모듈은 파이썬 내장 모듈이다. sys.built-in modules 은 파이썬에서 제공하는 파이썬 공식 라이브러리들이 모여있어서 내장 모듈을 찾을 수 있다.

3. Absolute path와 relative path의 차이점은?

  Absolute path는 import를 하는 파일의 최상단 디렉토리를 기준으로 경로를 잡기 때문에 항상 경로가 동일하다. 반면에 Relative Path는 import 하는 파일의 위치를 기준으로 경로를 정의한다. 그래서 상대적으로 경로가 짧은 편이다.

4. calculator 패키지 만들기

<조건>
디렉토리 구조는 다음과 같고 각 파일의 코드내용은 다음과 같습니다.
__init__.py 파일에는 아무코드도 없지만 init 파일은 해당 디렉토리가 패키지임을 알려주는 역할을 합니다.

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)

  폴더 안에 calculator 파일과 main.py 파일을 만든다. calculator 안에 __init__.py, add_and_multiply.py, multiplication.py를 만들어 넣는다.

5. main.py에서 상대경로로 add_and_mutiply 를 임포트 했을 때 발생하는 에러를 확인하고, 다음의 파이썬 공식 문서를 참고해서 main module 에서는 패키지의 모듈을 어떻게 임포트 해야하는지 정하라.

  상대 경로로 import 했을 때 나온 error 내용. 뭔소린가 했는데 공식문서 만세 파파고 만만세다!

Note that relative imports are based on the name of the current module. Since the name of the main module is always "main", modules intended for use as the main module of a Python application must always use absolute imports.

상대 가져오기는 현재 모듈의 이름을 기반으로 합니다. 메인 모듈의 이름이 항상 "main"이기 때문에 파이썬 애플리케이션의 메인 모듈로 사용하기 위한 모듈은 항상 절대 가져오기를 사용해야 한다.

  결론은 main.py 에서 import 할 때는 항상 절대경로로 임포트 해야한다.

6. add_and_multiply.py에서 multiply함수를 절대경로와 상대경로도 각각 임포트 해보고 main 모듈과 차이점을 생각해보고 결과를 출력해 보세요.

  절대경로 외에 상대경로는 모두 error가 난다...? 왜 그런가 했는데 add_and_multiply.py에서 돌리는게 아니라 main.py 에서 돌려야 하는거였다. add_and_multiply.py에는 함수만 정의되어있어서 돌릴게 없기 때문.

  절대경로와 상대경로 둘다 잘 돌아간다.

7. __init__.py 파일의 역할은 무엇인가?

  __init__.py 파일은 파이썬 파일들을 담고 있는 디렉토리가 패키지임을 알려주는 역할을 한다.

  • python3.3 버전부터는 __init__.py 파일이 없어도 패키지로 인식한다(PEP 420).
  • 하지만 하위 버전 호환을 위해 __init__.py 파일을 생성하는 것이 안전한 방법이다.

  패키지 안에 __init__.py 파일이 있으면 패키지가 import 될때 __init__.py 파일의 코드들이 자동으로 실행된다.

  1. Import 할때 경로의 총 길이를 줄여준다.

  2. 패키지에서 import 할 수 있는 변수/함수/클래스 제한한다(__all__ 변수)

      특정 디렉터리의 모듈을 를 사용하여 import할 때에는 다음과 같이 해당 디렉터리의 __init__.py 파일에 __all__ 변수를 설정하고 import할 수 있는 모듈을 정의해 주어야 한다. 여기에서 __all__이 의미하는 것은 해당 디렉터리에서 기호를 사용하여 import할 경우 >이곳에 정의된 특정 모듈만 import된다는 의미이다.

    # 경로명~/__init__.py
    __all__ = ['모듈명']
  3. 패키지가 import될때 꼭 먼저 실행되어야 하는 코드들을 지정한다.

profile
backend developer 🐌

0개의 댓글