2023. 2. 9. 18:58ㆍ코딩/파이썬
import sys
이 코드의 의미는 'sys'모듈을 이 소스파일에 불러온다는 뜻이다. sys는 파이썬 설치 시 같이 설치되는 라이브러리 모듈인데, 파이썬 모듈에 대한 설명은 다음에 자세히 하고, 오늘은 모듈과 패키지의 개념만 알아보자.
모듈
모듈이란?
클래스, 함수, 변수 등을 포함한 python 파일이다. 즉, 그냥 파이썬 파일을 따로 빼놓은 것
코드를 짜면서 이런저런 함수나 클래스들이 많아지면 보기 좀 더럽기도 하고, 나중에 다른 프로젝트에서 필요할 때
해당 부분을 찾아서 복붙해야하는 불편함이 있는데, 이런 불편함을 해소시켜주는게 모듈이다.
다음 모듈은 반지름을 인수로 받아 원의 넓이와 지름을 계산하는 클래스를 포함한다.
#mcircle.py
PI = 3.14
class Circle:
def __init__(self,r):
self.r = r
def carea(self):
return PI*self.r*self.r
def cdiameter(self):
return 2*PI*self.r
모듈 불러오기
_test_package.py에서 Circle 클래스의 메서드들을 쓰려면 mcircle을 import 해줘야 한다.
mcircle.py는 _test_package.py와 같은 디렉토리에 있어야 한다.
#_test_package.py
import mcircle
c1 = mcircle.Circle(3)
area = c1.carea()
diameter = c1.cdiameter()
print(f"원 넓이 : {area}, 원 지름 : {diameter}")
이제 mcircle 모듈에 있는 메서드와 클래스, 전역 변수인 PI도 _test_package.py에서 쓸 수 있다.
디버그를 통해 어떻게 작동하는지 살펴보자.
line 3에 브레이크 포인트를 걸고 ..
먼저 line 3이다. c1에 Circle클래스를 대입하기 전이다.

mcircle 파일의 Circle 클래스에 r = 3이 전달되었다.

다음으로 넘어가면 c1에 mcircle.Circle이 저장된 것을 볼 수 있다.

line 4, area = ... 부분이다. carea( )함수에서 결과값을 받기 위해 mcircle.py로 이동했다.

area에 값이 저장되며 _test_package.py로 돌아왔다.

이제 import된 모듈이 어떻게 쓰이는지 감이 올 것이다.
두번째 코드블럭을 보면 mcircle의 Circle 클래스를 사용하기 위해 mcircle.Circle( )의 형태를 취하고 있다.
mcircle.을 빼고싶다면 다음과 같이 하면 된다.
#_test_package.py
from mcircle import Circle
c1 = Circle(3)
mcircle 모듈의 Circle 클래스를 사용하겠다는 뜻이다.
만약 mcircle 모듈에 Square라는 클래스가 있고, Circle과 Square을 둘 다 사용하고싶다면?
#1. 두 클래스(또는 메서드)나열하기
from mcircle import Circle, Square
#2. 모듈에 있는 모든 것을 쓴다고 명시
from mcircle import *
*은 파이썬 정규식으로 '모든 것'을 나타내는데, 정규식에 대해서는 나중에 알아볼 예정이다.
만약 import할 요소의 이름을 바꾸고 싶다면 다음과 같이 한다.
from mcircle import Circle as shape

__name__ = "__main__"
모듈을 아래와 같이 수정했다. 다른 것은 모두 같고 아래 위에 print( ) 함수만 추가한 것이다.
print("모듈 mcircle")
PI = 3.14
..............
if __name__ == "__main__":
print("if문 안 구문")
실행결과는 다음과 같다.

if문 안에 있는 print( )함수는 동작하지 않고, 맨 위에 있는 print( )함수의 구문만 출력되었다. 왜 그런 것일까?
__name__ 변수는 파이썬의 내장 변수로, 모듈의 이름을 담는다. 그런데 모듈 파일에서 해당 모듈을 실행하면 __name__변수에는 모듈의 이름이 담기지만 다른 파일에서 해당 모듈을 불러서 사용할 경우엔 __main__값이 담긴다.
즉, if문의 의미는 mcircle파일에서 직접 실행할 때만 print하라~ 라는 뜻이 되겠다.
헷갈린다면 직접 디버깅으로 확인해보자.


다른 디렉토리에 있는 파일에서 모듈 불러오기
여태까지는 같은 모듈이 실행하는 파일과 같은 디렉토리에 있어야 했다.
다른 경로에 있는 파일에서도 모듈을 불러보자.
C:\pymodules\square.py파일을 다음과 같이 작성한다.
class Square:
def __init__(self,a,b):
self.a = a
self.b = b
def sarea(self):
return self.a*self.b
이 모듈을 이제 _test_package.py에서 사용하려면 모듈이 있는 경로를 지정해줘야 한다.
방법은 두가지가 있다.
1. sys.path에 경로 추가하기
파이썬 내장모듈인 sys를 사용하면 파이썬 라이브러리가 설치된 디렉토리를 확인할 수 있다.
(라이브러리는 패키지의 모음이며, 패키지는 모듈의 모음이다)
파이썬 콘솔에서 확인해보자.

이 path에 모듈의 경로를 추가해주면 된다.
import sys
sys.path.append("C:\pymodules")

이제 _test_package.py에서 square 모듈을 불러올 수 있다.

문제없이 square모듈의 클래스와 메서드를 사용할 수 있었다.
2. 환경변수 사용하기
두 번째 방법은 PYTHONPATH환경변수에 모듈이 있는 디렉토리를 추가해주는 것이다.
터미널에 set PYTHONPATH=디렉토리경로를 입력한다. 띄어쓰기가 있으면 에러가 날 수도 있으니 주의하자.
set PYTHONPATH=C:\pymodules
마지막으로 파일 이름을 test_package로 했을 때 다음과 같은 에러가 떳었다. test에 무슨 기능이 있는 것 같다.
파일 이름을 _test_package로 바꾸면 정상 작동한다.

'코딩 > 파이썬' 카테고리의 다른 글
파이썬 데이터프레임(Dataframe) (0) | 2023.02.09 |
---|---|
딕셔너리(Dictionary) (0) | 2023.02.09 |
리스트(List) (0) | 2023.02.09 |
사용차 입출력 (0) | 2023.02.09 |
객체와 변수 (0) | 2023.02.09 |