*참고: 이 블로그의 포스트들은 개념 설명이 장황할 때가 많습니다. 그냥 코드만 보고 지나가기에 아까운 주변 지식들이 많습니다. 특히 영어와 한글번역의 차이가 나는 부분들이 그렇습니다. 나중에 다시 보면 가치 있기를 바라며...
모듈과 패키지,클래스,함수 등을 구분하는게 어려울 수도 있다.
아 그런데 프로그래밍에서는 같은 것을 두고 상황에 따라 여러개의 이름으로 부르는 경우가 많다. 그래서 개념적으로 이미 알고 있는 구조인데도 용어를 몰라서 모르게 되는 경우가 있다. 이것은 하나의 단어를 몰라서가 아니라 그 용어를 담는 시스템을 아직 모르기 때문이다.
예를 들어서 전통의 Procedural Programming 에서는 함수(Function)라고 한다. 그런데 객체지향 프로그래밍(OOP)에서는 메소드(method)라고 한다. 파이썬에서는 내장함수(Built-in-Function) 라고 하는데 자바에서는 내장메소드(Built-in-Method)라고 한다. 코드를 작성하는 사람이 아무런 차이도 느끼지 못하더라도 다른 용어를 사용한다. 왜일까?
새로운 용어를 배울때 단순히 외워서만 되는것이 아니라 그 용어의 주변 상황과 전체 시스템에 대한 이해가 필요하다. 왜라는 것은 전체 시스템에 대한 이해도가 높아질 수록 이해도가 높아진다.
모듈은 함수,변수,클래스를 모아 놓은 파일이다.
모듈을 계층적 구조로 모아놓으면 패키지가 된다.
파이썬의 라이브러리나 프레임워크는 패키지로 이루어진다. 꼭 파이썬 언어로 작성되지 않는다. C로 작성된 동적 라이브러리를 로드할 수도 있기 때문에 파이썬의 기능은 강력하게 확장될 수 있다.
파이썬의 패키지를 설치한다는 말은 패키지 단위의 라이브러리와 프레임워크를 추가적으로 설치한다는 말이다. 웹사이트를 개발하기 위한 파이썬 장고 프레임워크 (django '쥉고' 라고 발음한다) 빅데이터를 분석하기 위한 판다스(Pandas) 라이브러리, 게임을 개발하기 위한 Pygame 프레임워크 등은 파이썬의 패키지이다. 윈도우나 리눅스, 맥OS 등에서 pip 명령어로 손쉽게 설치가 가능하다.
이것들을 따로 설치하는 이유는 간단하다. 파이썬 기본 개발환경에 넣기엔 용량이 많고 각자 프로그램의 목적에 맞는 설정을 해줘야한다. 빅데이터를 분석할일이 없는데 판다스를 설치할 필요가 없다. 네트워크 트래픽만 늘어나고 컴퓨터의 용량만 잡아먹는다.
파이썬을 설치할때는 가장 기본적인 라이브러리들만 설치된다. 일반적으로 꼭 사용할 것 같은 라이브러리들이다. sys 나 math 등이 대표적이다. 그리고 아예 너무 자주 쓰는 기능은 내장함수(built-in-function)에 이미 키워드 처럼 등록이 되어있다. print 나 input 이 대표적이다.
그러니까 파이썬 패키지들이 배포될 때는 어떤 사람들이 얼마나 이 기능들을 사용할 것인가를 사전에 충분한 협의를 통해 정해놓았다는 말이다. 그리고 업데이트 할 때 마다 시대적 요구사항이나 커뮤니티의 필요에 의하여 새로운 기능들이 추가될 수 도 있고 낢은 함수들은 삭제될 수도 있다.
https://pypi.org/ 파이썬 패키지 인덱스 - 프레임워크 소프트웨어의 저장소(repository)이다.
PYPI에는 수십만개의 프로젝트가 현재도 진행중이고 웬만한 굵직굵직한 프레임워크들을 안정적으로 배포하고 있다. 파이썬은 일반인들이 쉽게 사용할 수 있다는 장점에 더해서 +@ 워낙 다양한 패키지를 제공하니 사용자가 늘수밖에 없다. 알아야 할 패키지가 많으니 파이썬이 꼭 쉽지는 않다. 다른 공학에서 쓰는 소프트웨어들까지 범위가 워낙 많기 때문이다.
아래의 링크는 2020년 top 10 must-have 파이썬 패키지이다. 수학을 위한 NumPy 부터 동영상 처리를 위한 MoviePy 까지 다양한 패키지들이있다. 이 블로그에서도 파이썬 패키지를 말하자면 list 100도 모자르다고 한다. (어그로를 끌려고 top 10이라고 했나...) general purpose 의 관점에서 top 10이라고 한다.
https://www.activestate.com/blog/top-10-must-have-python-packages/
파이썬으로 뭔가를 해보고 싶다면 모듈을 사용할 줄 알아야 한다. 그런데 패키지로 다운받아 모듈을 열어보면 해석하기가 보통이 아니다.
모듈을 직접 만들어 보자.
<예제> newmod.py
class A:
def __init__(self):
self.num = 1
self.str = "Module Test"
def add(self,a,b):
return a + b
def testString():
print("This is new module")
num1 = 10
모듈파일을 만든다. 클래스와 함수 변수를 선언했다.
<예제>testmod.py
import newmod
a1 = newmod.A()
print(a1.add(10,5))
print(a1.num)
print(a1.str)
newmod.testString()
print(newmod.num1)
모듈을 import 한다. import가 이거였다. 모듈을 가져오는 것이었다. .py 확장자를 붙이지 않도록 주의한다. 붙이면 에러메시지를 볼수있다.
모듈이름에 . 도트 연산자를 붙인 후에 모듈안의 이름들을 사용할 수 있다. 클래스는 인스턴스화 해서 메소드를 호출하고 멤버변수들을 가져온다. 함수와 변수는 모듈의 이름 . 도트연산자로 사용한다.
모듈을 사용하려면 같은 디렉토리(폴더)에 저장되야 한다. 그동안 random 이나 sys 같은 모듈을 사용할 수 있었던 것은 패키지를 설치하면서 내부의 라이브러리 폴더에 저장되어있기 때문이다. 사용자가 모듈을 만든 경우 별도의 경로설정을 하지 않았다면 같은 폴더에 있어야 한다.
from newmod import *
a1 = A()
print(a1.add(10,5))
print(a1.num)
print(a1.str)
testString()
print(num1)
import 의 다른 방식은 from ~ import * 이다. *는 All(모든것)과 같다. 현재의 이름 공간에 모듈의 모두를 가져온다는 것이다. newmod를 생략할 수 있다. 그러니까 A() 로 바로 지금 파일에서 만든 것처럼 클래스를 생성할 수 있다. 함수와 변수도 마찬가지다. 결과값은 위의 모듈테스트와 같다.
__name__ <- 언더스코어 두개씩 감싸고 있다. 이것은 파이썬이 모듈에 대하여 파악하는 것이다.
newmod.py 에 아래와 같이 추가한다.
n1 = __name__
testmod.py 에 아래와 같이 추가하고 실행한다. (실행은 testmod.py를 실행시켜야 한다)
print(__name__)
print(n1)
__name__ 은 지금 이 파일을 main으로 하고 있다. newmod는 파이썬에서 인식하는 모듈의 이름이다.
말 그대로 __main__이 패키지의 메인 파일이라는 것이다. 만약 newmod에 실행코드가 적혀있다면 import 시 그대로 실행이 된다. 의도치 않은 동작을 초래할 수 있기 때문에 import 하는 모듈의 실행코드에 다음과 같이 작성해서 실행이 안되게 한다.
if __name__ == "__main__":
print("Hello Wolrd") #메인 모듈이 아니면 실행안됨
혹은
if __name__ != "newmod": #모듈의 이름
print("Hello Wolrd") #메인 모듈이 아니면 실행이 안됨
newmod를 import한 testmod 를 다시 import 할 수 있다.
새로운 파일 nextmod.py를 만든다.
import testmod
print("this is nextmod")
결과를 보면 testmod를 실행한 후 nextmod 모듈을 실행한다. 이렇게 모듈을 연결 시킬 수 있다. 파이썬의 추가 패키지를 설치하고 해석하기 쉽지 않은 것은 하나의 모듈에 여러개의 모듈이 복잡하게 연결되어 있는 경우가 많기 때문이다. 그런 것은 객체지향프로그래밍과 디자인 패턴 등 설계를 공부해야 알 수 있다.
파이썬이 쉽다고 처음부터 욕심을 내는 것 보다 단계적으로 학습하는 것을 추천한다. 물론 몰라도 크게 지장은 없다. 오픈소스 모듈을 개발할게 아니라면.
남들이 만들어 놓은 모듈을 잘 활요하는 것도 능력이다. 이제 모듈의 사용법을 알았으니 관심있는 패키지들을 다운로드 받아 실행해보길 바란다. 워낙 다양한 패키지가 나와있고 계속 개발되고 있기 때문에 뭔가에는 관심이 있을 것이다.
django로 웹개발을 해도 좋고, pygame 으로 게임을 개발해도 좋다. 최근에는 openCV 같은 비디오 프로세싱 패키지도 나와있다. 얼굴인식 같은 복잡한 컴퓨터분석도 상당히 가능하다고 한다. 돈 드는 건 아니니까 관심있으면 도전해보는 것도 좋을 것 같다.
기타사항
만일 모듈을 다른 디렉토리에서도 사용하고 싶다면 파이썬의 sys.path (일종의 라이브러리 환경 변수)에 추가하면 된다.
append 명령어로 추가할 수 있다. sys.path 값은 리스트이다.
import 명령어로 가져올 수 있다.
모듈의 클래스를 생성하여 메소드를 문제없이 호출하였다.