본문 바로가기
Python

Modules and Package (Feature)

by Adam92 2020. 6. 3.

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


  • sys.modules는 package를 찾기위해 가장먼저 확인하지만, sys.path는 마지막으로 확인한다.
  • sys.modules는  단순한 dictionary이고, sys.path는 string요소를 가지고있는 list이다.

 

 

2. How to search sys.module ?


python이 module / package를 찾는 순서는 

 

1. sys.modules

2. built-in modules

3. sys.path 

 

인데, sys.modules는 built-in 모듈이기때문에 built-in에서 찾는다. 

밑에 sys를 import하고 sys.modules를 프린트하면 bulit-in이라고 나온다.

import sys

print(sys.modules)

# results >> {'sys': <module 'sys' (built-in)>, 'builtins': <module 'builtins' (built-in)>

 

 

3. Absolute path와 relative path의 차이점


Absolute path는 프로젝트 내에서는 어느 파일, 어느 위치에서 import 하던지 경로가 항상 위와 같이 동일하고,

  relative path는 프로젝트의 최상단 디렉토리를 기준으로 경로를 잡는게 아니라 import 하는 위치를 기준으로 경로를 정의한다.

 

└── my_app
    ├── main.py
    ├── package1
    │   ├── module1.py
    │   └── module2.py
    └── package2
        ├── __init__.py
        ├── module3.py
        ├── module4.py		# 현재위치
        └── subpackage1
            └── module5.py

 

지금 나의 경로가 package2의 module4에 있을때, subpackage1의 module5의 func()함수를 import하려고하면

각각의 경로는

# package2/module4.py

from package2.subpackage1.module5 import func()	# absolute path

from .subpackage1.module5 import func()	# relative path

 

4. Calculator


main.py 상대경로로 add_and_multiply를 임포트 했을 때

# 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))
    
Error ==>  No module named '__main__.calculator'; '__main__' is not a package

찾아보니 메인모듈은 항상 절대경로로 임포트해야된다고한다. 

왜냐하면 메인모듈의 __name__ 값은 relative path 일때는 파일명으로 변경이 되고 absolute path일떄 main이기 때문인것같다.

 

Main Module

 

그래서, 절대경로로만 임포트하면 정상적으로 실행된다.

# absoulte path
from calculator.add_and_multiply import add_and_multiply 

if __name__ == '__main__':
    print(add_and_multiply(1,2))
    
Results ==> 5

 

 

 

 

add_and_multiply.py에서 multiply함수를 절대경로와 상대경로로의 임포트

 

상대경로로 임포트했을 경우

from .multiplication import multiply



def add_and_multiply(a,b):
	return multiply(a,b) + (a+b)
    

# error => Attempted relative import in non-package

# 상대경로로 임포트 하면 main.py의 __name__이 파일명으로 바뀌어가지고 오류가 뜨는것같다.

 

절대경로로 임포트했을 경우

from multiplication import multiply

def add_and_multiply(a,b):
	return multiply(a,b) + (a+b)
    

# 절대경로로 바꾸면, main module로 바뀌면서 main.py에 영향을 주지않아서 작동되는 것같다.

 

__init__.py의 역활

  • __init__.py 파일을 통해 package 초기설정을 가능케한다.

  • 경로의 총길이 줄여주는 역활
  • Package에서 import 할 수 있는 변수/함수/클래스 제한하기
  • 그 외 package가 import될때 꼭 먼저 실행되어야 하는 코드들

  • _init__.py 파일에는 아무코드도 없지만 init 파일은 해당 디렉토리가 패키지임을 알려주는역활

 

'Python' 카테고리의 다른 글

Python Assignment (List comprehension)  (0) 2020.06.04
Python etc..  (0) 2020.06.04
Modules and Package  (0) 2020.06.02
Class  (0) 2020.06.01
List : 추가 와 변경  (0) 2020.05.28