python) import ?, __init__ ?, form .lib 의 '.' ?

2023. 4. 26. 23:09학습/python

import 는 다른 파이썬 파일을 참조할 때 사용한다.
만들어둔 .py 파일에서 import 해서 함수를 가져올 수 있다.

 

파이썬 기본 제공 라이브러리를 가져올 때 사용.
os, glob, sys, functools 등등..
이들은 파이썬 설치할 때 자동으로 같이 받아져서. 기본 paht 에 저장되어 있다.

또한  pip, conda install 로 받을수 있는 추가적인 라이브러리
파이썬은 과학/ 공학/ 통계 라이브러리들을 특화적으로 지원하는데
numpy, scipy, matplotlib, pandas 등등

그런데 import 하다보면

form 어쩌구 import 어쩌구 가 있는데 뭐냐..

import A : A.py의 전체를 가져오겠다.
form A import B : A.py의 B 함수를 가져오겠다는 뜻

 

from math import sqrt
root_sixty = sqrt(9)
print(root_sixty)

이런식으로 math 에서 sqrt라는 함수를 가져올수 있다.

 

가져올 함수가 많다면 import 그냥 전체 가져오기
몇가지만 가져올거면 from A import B

import 를 사용한다는 것은 
만약에 프로젝트를 할때 import 를 못 쓴다면
모두 구현해서 넣어야하는데 논리적으로는 문제가 없지만

만약 공유나, 코드리뷰 떄 main.py 에 다넣는다고 생각하면 가독성이 매우 떨어진다.

또한 함수를 테스트할때마다 위에서부터 코드를 모두 실행하면서 내려오기에 시간 리소스도 낭비된다.

 

그래서 기준으로 나눠서 .py 로 나눠둬서 관리를 한다.

 

 

__name__  이걸 왜쓰지?

특이한 점을 배웠는데.

왜 test_of_square_func(3) : 9  가 왜 나오는거지?

 

테스트 할 때는 print 하고 (python square.py)
import 할 때는 print 안 하고 싶은데... (import square)

그 문법이
if __name__ == "__main__":
    print("test of square_func(3) : {}".format(square_func(3)))

__name__ 이것이다.

 

import square 하면 False
python square.py 하면 True

 

square2.py 를 만들어두고

이런식으로 print() 는 작동하지만

if __name__ == "__main__": 를 이용하면 테스트할때만 코드를 사용하고,

import 떄는 돌아가지 않는다.

 

또한 변수도 불러올 수 있다.

 

 

 

 

다른 폴더의 .py import

다른 문제는 forder 폴더 안에 abc.py, cde.py 가 있는데 
abc.py 안에서 cde.py 를 import 하고 있는 상황이면
main.py 에서 실행하려면 abc.py 에서는 어떻게 임포트 해야할까?

 

정답은 import forder.cde 로 abc.py 에서도 임포트 해줘야한다.

import 파일명은 : 실행 파일 위치 기준
문자열 파일명 : 실행 폴더 위치 기준 (open("forder/cat.txt").read()) 같은 구문을 쳤을경우. 실행 기준 위치가 달라서 주의

 

__init__.py 는 도대체 뭐지?

열어보면 form .cat import bark
 이런데 왜 앞에 . 이 붙는거지??

 

__init__.py 가 있다는 것은
이 파일이 포함된 폴더를 그대로 import 할수 있다는 말이다.

import forder 를 한다면
forder 폴더를 찾아서 그안에있는 __init__.py를 찾아서 실행을 하게 된다.

 

만약 __init__.py 가 없다면
폴더를 import 하긴 하지만 안에 있는 py들이 임포트 되지않아 제대로 작동하지 않는다.

 

__init__.py 안에 보면

from .A import A_func
가 있는데 왜 . 이 붙어있지?

원래 import 하려고하면
from forder.A import A_func 를 해야하지만

forder.py 에서 미리 A.py, B.py 임포트 해준다.

. 은 "지금 폴더에 있는" 을 의미한다.
from .파일명 import ... 면

. 은 바깥 폴더에서 import 당했고 폴더 안 파일들끼리 import 할 때만 사용할 수 있다.
. 없으면 같은 폴더 안에서 실행된 파일들 끼리 import 할 때만 (. 붙이면 오류남)

 

 

 

 

정리

1. import는 다른 파일 코드를 가져오는 기능
2. import, from 시 코드 전체를 실행한다.
    테스트용 코드는 if __name__ == "__main__" 활용
3. __init__.py : 폴더가 파이썬 파일이 되는 효과
    from .파일명 import 함수 : 지금 폴더 바깥에서 import 당했을 때만 사용 가능함 
    보통 from .파일명 import ... 랑 같이 사용
    import 폴더 : 폴더 안의 __init__.py를 실행함.

728x90