Python module & package Assignment

김성진·2020년 8월 24일
0
post-thumbnail

우선 파이썬은 아래와 같은 순서로 module*package를 찾는다

1. sys.modules
2. built-in modules
3. sys.path

sys.modules 와 sys.path의 차이점을 서술해 주세요.

sys.moduels:
a.파이썬이 모듈이나 패키지를 찾기 위해 가장 먼저 확인 하는 곳.
b.단순한 dictionary 구조
c.import 되어 있는 모듈과 패키지 저장.(다시 찾지 않아도 됨)
sys.path:
a.파이썬이 모듈이나 패키지를 찾기 위해 가장 마지막에 확인하는곳.
b.기본적으로 list이고, string 요소들을 가지고 있음.
c.처음의 리스트부터 마지막까지 찾음
d.파이썬에 포함되있는 built-in modules
e.sys.path에서 발견 못하면 ModuleNotFoundError 에러를 리턴

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

파이썬은 스크립트 실행시 PYTHONPATH, 환경설정, 변수, 위의 모듈들을 순차적으로 실행하고 이러한 3RD 파티는 설치시 자동으로 절대경로(""STRING타입)가 설정이되어 찾기 쉬움

Absolute path와 relative path의 차이점을 서술해 주세요.

Absolute path는 이름 그대로 절대 경로 입니다. 왜 절대 경로인가 하니, import를 하는 파일이나 경로에 상관없이 항상 경로가 동일하기 때문입니다. my_app 이라는 프로젝트 이며 package1과 package2 라는 2개의 package를 가지고 있습니다.
그리고 package2는 subpackage2 라는 중첩 package를 가지고 있습니다.
Relative path 는 absolute path와 다르게 프로젝트의 최상단 디렉토리를 기준으로 경로를 잡는게 아니라 import 하는 위치를 기준으로 경로를 정의합니다. Relative path는 선언해야 하는 경로의 길이를 줄여준다는 장점은 있지만 헷갈리기 쉽고 파일 위치가 변경되면 경로 위치도 변경되어야 하는 단점이 있습니다. 그러므로 웬만한 경우 absolute path를 사용하는게 권장 됩니다.

calculator 실습

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

ㄴ calculator
init.py
ㄴ add_and_multiply.py
ㄴ multiplication.py
ㄴ main.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))
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)

에러코드
ImportError: attempted relative import with no known parent package
main.py 에서는 absolute path(절대 경로)로만 패키지의 모듈을 임포트 해야 하기때문에 에러가 뜬다!

init.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))

정상적으로 실행된다.

profile
multi-national communicator with programming (back-end)

0개의 댓글