일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
- typescript
- 프로미스
- on_delete
- rebase
- nodeJS
- 스코프
- django westagram
- javascript
- docker
- 자바스크립트
- pm2
- async/await
- CORS
- TypeError: this.boardRepository.createBoard is not a function
- manytomanyfield
- 실행 컨텍스트
- status code
- 장고초기세팅
- 호이스팅
- JWT
- OSI7계층
- 트랜잭션
- node
- westagram
- wecode
- crud2
- Django
- 노드
- bcrypt
- Jest
- Today
- Total
될때까지
((Python)) How import statement finds modules and packages 본문
### 과제 ###
1. sys.modules 와 sys.path의 차이점을 서술해 주세요.
import sys
print(sys.path) # str이 담긴 리스트로 출력된다.
print(sys.modules) # 딕셔너리 구조로 출력된다.
sys.modules
- 파이썬이 모듈이나 패키지를 찾기 위해 가장 먼저 확인하는 곳
- 딕셔너리 구조
- 이미 import된 모듈과 패키지들을 저장하고 있음
- 새로 import하는 모듈은 sys.modules에서 찾을 수 없음
sys.path
- 가장 마지막으로 확인하는 장소
- 리스트 구조며 string요소들을 가지고 있음
- sys.path에서도 모듈을 발견하지 못하면 ModuleNotFoundError를 리턴함
=> sys.modules는 제일 먼저 찾는 곳이고 (그 다음에는 파이썬 built-in모듈을 확인한다.) sys.path는 제일 마지막에 찾는 장소다. 또한 sys.modules는 딕셔너리 구조지만 sys.path는 스트링 요소들을 가지고 있는 리스트 구조로 되어있다는 점이 둘의 차이점이다.
2. sys 도 import 해야하는 모듈입니다. 파이썬은 sys 모듈의 위치를 어떻게 찾을 수 있을까요?
import sys
print(sys) # <module 'sys' (built-in)>
=> sys를 출력해보면 built-in 모듈이라고 나온다. 파이썬이 sys를 처음 import할 때 sys.modules에 찾아보지만, 새로 import하는 모듈이니까 찾을 수 없다. 그래서 다음 경로인 built-in모듈에서 찾게 되고 이 때 sys의 위치를 확인할 수 있다.
3. Absolute path와 relative path의 차이점을 서술해 주세요.
https://i-c-a-n-d-o.tistory.com/112
개념정리 :: 절대경로 vs 상대경로?
이 블로그에 정리되어있는 모든 개념들은 학습 개념으로 혼자 정리한 내용입니다. 잘못 기술한 부분이 있을 수 있으니 발견하시면 언제든지 지적해주세요😄 🦸♀️ 개념정리 - 절대경로(Abso
i-c-a-n-d-o.tistory.com
4. calculator 패키지 만들기 + 5.main.py에서 상대경로로 add_and_mutiply 를 임포트 했을 때 발생하는 에러를 확인하고, 다음의 파이썬 공식 문서를 참고해서 main module 에서는 패키지의 모듈을 어떻게 임포트 해야하는지 블로깅 해주세요.

* calculator > multiplication.py
def multiply(a,b):
return( a * b )
* calculator > 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)
* main.py
# absolut path 절대경로
from calculator.add_and_multiply import add_and_multiply
# relative path 상대경로
# from .calculator.add_and_multiply import add_and_multiply
# 오류 발생 ImportError: attempted relative import with no known parent package
if __name__ == "__main__":
print(add_and_multiply(1,2))
main.py에서 상대경로를 사용하여 import를 했더니 ImportError가 발생했다. 알려진 상위 패키지에서 상대 import를 시도했다. 구글링해봤더니 상대경로를 사용해서 import를 하면 현재 모듈안에 __main__이 설정되어있는 경우 현재 파일의 위치가 루트(최상위) 디렉토리가 된다. 루트 디렉토리에서 .을 찍어서 찾아갈 상위 패키지가 없으므로 에러가 발생한다.
# absolut path 절대경로
from calculator.add_and_multiply import add_and_multiply
# relative path 상대경로
# from .calculator.add_and_multiply import add_and_multiply
# 오류 발생 ImportError: attempted relative import with no known parent package
if __name__ == "__main__":
print(add_and_multiply(1,2))
절대경로로 바꿔 실행하면 결과값 5가 제대로 출력이 된다.
6. add_and_multiply.py에서 multiply함수를 절대경로와 상대경로도 각각 임포트 해보고 main 모듈과 차이점을 생각해보고 결과를 출력해 보세요.
==> 결과는 동일하게 잘 실행이 된다. 기본 모듈은 다른 패키지나 모듈을 import할 때 절대경로를 사용해야하며, 기본 모듈이 아닌 경우는 절대경로, 상대경로 모두 사용할 수 있는 것 같다.
7. __init__.py 파일의 역할에 대해서도 정리해서 블로깅 해주세요.
- __init__.py파일이 없으면 패키지로 인식을 하지 않기 때문에 __init__.py를 꼭 만들어주는 게 좋음
- python 3.3버전부터는 없어도 된다하지만 하위버전과 원활한 호환을 위해 생성하는 것이 좋음
- 패키지안에 __init__.py파일이 있으면 패키지가 import될 때 __init__.py파일의 코드들이 자동으로 실행된다.
- __init__.py파일에 먼저 사용할 모듈들을 import해주면 다른 파일에서 import할 때 경로의 길이가 줄어든다.
https://www.youtube.com/watch?v=vhzdwoJangI
'프로젝트 > wecode' 카테고리의 다른 글
((Database)) 데이터베이스, 관계형 데이터베이스, 테이블의 관계, 스타벅스 모델링 (0) | 2022.06.27 |
---|---|
((MySQL)) 삭제하고 재설치하는 방법 (0) | 2022.06.27 |
((Python)) 데코레이터 끝내버리겠다. (0) | 2022.06.24 |
((Python)) 추가 개념정리 (0) | 2022.06.24 |
((Python)) Replit 55. Class (0) | 2022.06.23 |