[기초] Python 외부 모듈


모듈 설치하기

다음과 같이 입력해서 외부 모듈을 설치합니다.

외부 모듈은 Window + R키를 눌러 프로그램 실행창

을 띄우고 [cmd]를 입력하면 나타나는 명령 프롬프트

창에서 실행해야 합니다.

1
> pip install 모듈이름
cs

예를 들어 Beautiful Soup이라는 이름의 모듈을 설치한다면

다음과 같이 입력해서 설치합니다.

1
2
3
4
5
6
> pip install beautifulsoup4
Collecting beautifulsoup4
 Downloading beautifulsoup44.6.0py3noneany.whl (86kB)
  100|■■■■■■~■■■■| 92KB 422kB/s
Installing collected packages: beautifulsop4
Successfully installed beautifulsoup44.6.0
cs

pip은 정말 많은 기능을 가지고 있습니다. 특정 버전의 모듈을

설치하거나 설치한 모듈을 제거하는 기능 등을 모두 지원하는데

, 이와 관련된 내용은 pip 문서를 참고하자

1
2
[pip 패키지 설치 문서]
Https://pip.pypa.io/en/stable/user_guide/#installing-packages
cs

BeautifulSoup 모듈

BeauifulSoup은 괸장히 유명한 파이썬 웹 페이지

분석 모듈입니다. Beauiful Soup과 관련된 책을 보면

내부에 자세한 사용 방법이 나옵니다. 만약 책 없이 살펴보고

싶다면 해당 모듈의 공식 홈 페이지를 참고하면 됩니다.

구글에서 ‘Python Beautiful Soup’으로 검색하면 위에

Beauiful Soup 모듈의 공식 홈 페이지가 나옵니다. 이곳

에서 접속하면 관련된 문서를 살펴볼 수 있습니다.

1
2
Beauiful Soup 문서
https://www.crummy.com/software/BeautifulSoup/bs4/doc
cs

예제 로 BeauifulSoup을 사용해서 기상청의 날씨 정보를

가져와 출력 해 보자

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# 모듈을 읽어 들입니다.
from urllib import request
form bs4 import BeautifulSoup
# urlopen() 함수로 기상청의 전국 날씨의 읽습니다.
target = request.urlopen(“https://www.kma.go.kr/weather/forecast/mid-term-rss3.jsp?stnId=108”)
# target 코드는 한 줄 코드 입니다. 이어서 입력하십시오.
# BeautifulSoup을 사용해 웹 페이지를 분석합니다.
soup = BeautifulSoup(target, “html.parser”)
# location 태그를 찾습니다.
for location in soup.select(“location”):
    # 내부의 city, wf, tmn, tmx 태그를 찾아 출력합니다.
    print(“도시:”, location.select_one(“city”).string)
    print(“날씨:”, location.select_one(“wf”).string)
    print(“최저기온:”, location.select_one(“tmn”).string)
    print(“최고기온:”, location.select_one(“tmx”).string)
    print()
cs

Flask 모듈

일반적으로 파이썬으로 웹 개발 할 때는 Django(장고)또는

Flask(플라스크) 등의 모듈을 사용합니다.

Django는 매우 다양한 기능을 제공하는 웹 개발 프레임워크이고

, Flask는 작은 기능만을 제공하는 웹 개발 프레임워크 입니다.

한국에도 Django, Flask와 관련된 도서가 출간되어 있어

파이썬을 활용한 웹 개발에 관심이 있다면 이 책을 다음 도서로

살펴보자. 일단 이번은 Flask를 사용해 아주 간단한 웹 개발에

대해 간단하게 보겠습니다.

Flask 모듈은 다음과 같은 명령어로 설치합니다. Beautiful Soup

모듈 설치할 때와 마찬가지로 Window + R 키를눌러 프로그램

실행 창을 띄우고 [cmd]를 입력하면 나타나는 명령 프롬프트

창에서 실행해야 합니다.

1
> pip install flask
cs

다음 예제는 Flask 모듈의 공식 홈페이지

( https://flask.pocoo.org/ )

에서 제공하는 기본적인 예제입니다.

입력 후, 코드를 실행해 보세요

1
2
3
4
5
6
from flask import Flask
app = Flask(__name__)
@app.route(“/”)
def hello():
   return “<h1>Hello World!</h1>”
cs

참고로 @app.route(“/”)라고 되어 있는 부분은

데코레이터(decorator)라고 부릅니다. 이와 관련된

내용은 해당책 345쪽 <좀 더 알아보기: 함수 데코레이터> 확인

Flask는 코드를 실행하는 방법이 약간 특이한데,

다음과 같이 두 줄을 명령 창 또는 Powershell에 입력해서

실행합니다.

1
2
3
EX)
set FLASK_APP=파일 이름.py
flask run
cs

명령 프롬프트 창에서 프로그램을 실행하면

다음과 같이 출력합니다. 그냥 이렇게 출력하고 멈춰 있습니다.

1
2
3
4
> set FLASK_APP_basic.py
> flask run
 * Serving Flask app “flask_basic.py”
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
cs

프로그램을 종료할 때는 ‘(Press CTRL+C to quit)’라고

나와 있는 것처럼 Ctrl + C키를 눌러 종료 합니다.

BeautifulSoup + Flask 조합 예

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
# 모듈을 읽어 드립니다.
from flask import Flask
from urllib import request
from bs4 import BeautifulSoup
# 웹 서버를 생성합니다.
app = Flask(__name__)
@app.route(“/”)
def hello():
  # urlopen() 함수로 기상청의 전국 날씨를 읽습니다.
  target = request.urlopen(“https://www.kma.go.kr/wwather/forecask/mid-term-rss3.jsp?stnId=108”# 이 코드는 한 줄 코드이니 이어서 입력해야 합니다.
  # BeautifulSoup를 사용해 웹 페이지를 분석합니다.
  soup = BeautifulSoup(target, “html.parser”)
  # location 태그를 찾습니다. 
  output = “”
  for location in soup.select(“location”):
     # 내부의 city, wf, tmn, tmx 태그를 찾아 출력합니다.
     output += “<h3>{}</h3>”.format(location.select_one(“city”).string)
     output += “날씨: {}<br />”.format(location.select_one(“wf”).string)
     output += “최저/최고 기온: {}/{}”\
          .format(\
              location.select_one(“tmn”).string,\
              location.select_one(“tmx”).string\
         )
     output += “<hr />”
return output
cs

다시 이전과 같은 방법으로 코드를 실행하고 웹 브라우저에서

http://127.0.0.1:5000에 접속하면 다음과 같이 출력합니다.

라이브러리와 프레임워크

모듈을 살펴보면 라이브러리(ilbrary)와 프레임워크(famework)

라는 말을 많이 듣습니다. 최근에는 큰 구분 없이 사용하는데,

그래도 확실하게 구분하자면

제어 역전(IoC: Inversion of Control)여부에 따라서 달라집니다.

라이브러리와 프라임워크

구분 설명
라이브러리(library) 정상적인 제어를 하는 모듈
프레임워크(framework) 제어 역전이 발생하는 모듈

라이브러리

제어 역전이란 쉽게 말해 저어가 역전되어 있다는 뜻입니다.

따라서 ‘역전되지 않은 정상적인 제어’가 무엇인지 알아야

제어 역전을 이해할 수 있을 것입니다.

지금까지 사용했던 모듈들을 생각해 봅시다.

다음 코드는 07-1에서 살펴보았던 math 모듈입니다.

math 모듈은 모듈 내부의 기능을 ‘개발자’가 직접 호출했습니다.

이처럼 개발자가 모듈의 기능을 호출하는 형태의 모듈을

라이브러리(library)라고 합니다.

정상적인 제어 = 라이브러리

1
2
3
4
5
6
7
8
9
10
11
# 모듈을 읽어 들입니다.
from math import sin, cos, tan, floor, ceil
# sin, cos, tan를 구합니다.
print(“sin(1):”, sin(1))
print(“cos(1):”, cos(1))
print(“tan(1):”, tan(1))
# 내림과 올림을 구합니다.
print(“floor(2.5):”, floor(2.5))
print(“ceil(2.5):”, ceil(2.5))
cs

프레임워크

339쪽 <직접 해보는 손코딩(flask_basic.py)>에서 살펴보았던

Flask 모듈은 다음과 같이 코드를 작성했습니다. 그런데

코드를 보면 내부에 함수만 정의했지 직접적으로 무언가 진행하는

코드는 단 하나도 없습니다.

1
2
3
4
5
6
from flask import Flask
app = Flask(__name__)
@app.hello()
def hello():
    return “<h1>Hello World!</h1>”
cs

 

1
2
3
4
> set FLASK_APP=flask_basic.py
> flask run
 * serving Flask app “flask_basic.py”
 * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
cs

Serving Flask app “flask_basic.py”, Running on http://

127.0.0.1:5000/ (Press CTRL+C to quit)라는 글자는 우리가

출력했던 적이 없습니다. 그렇다면 이것은 어디에서 출력된

것일까요?

바로 Flask 모듈 내부입니다. 우리는. 우리가 작성한 코드를 직접

실행하지 않았습니다. Flask 모듈이 제공하는 명령어를 실행하면

Flack가 내부적으로 서버를 실행한 뒤 지정한 파일을 읽어 들여

적절한 상황에 스스로 실행하게 됩니다. 이처럼 모듈이 개발자가

작성한 코드를 실행하는 형태의 모듈을 프레임워크(framework)

라고 합니다.

개발자가 모듈의 함수를 호출하는것이 일반적인 제어 흐름입니다.

그런데 이와 반대로 개발자가 만든 함수를 모듈이 실행하는 것은

제어가 역전된 것입니다. 이것이 바로 제어 역전

(IoC:Inverse of Control)입니다.

이러한 제어 역전의 여부로 라이브러리와 프레임워크를

구분합니다.

함수 데코레이터

파이썬에는 데코레이터(decorator)라는 기능이 있습니다.

07-2의 <Flask 모듈>에서 잠깐 언급하면서 @app.route()

형태의 코드를 보았습니다. 이렇게 @로 시작하는 구문을 파이썬

에서는 ‘데코레이터’라고 부름니다. 데코레이터는 ‘꾸며 주는 것’

이라는 의미인데, 프로그래밍에서는 무엇을 꾸민다는 걸까요?

데코레이더는 만드는 방법에 따라 크게 함수 데코레이더 와

클래스 데코레이더로 나눌 수 있습니다. 여기서는 함수

데코레이터를 살펴보겠습니다.

함수 데코레이터의 기본

함수 데코레이터는 함수에 사용되는데코레이터입니다.

이 말은 대상 함수의 앞뒤에 꾸밀 부가적인 내용을, 혹은

반복할 내용을 데코레이터로 정의해서 손쉽게 사용할 수 있도록

한 것을 말합니다. 이렇게 말해도 잘 이해가 안되죠? 처음에는

이해가 잘 안되겠지만 예제 하나만 실행해 보면 쉽습니다.

다음은 “hello”를 출력하는 함수입니다.

1
2
def hello():
   print(“hello”)
cs

 

그런데 “hello” 앞에 “인사가 시작되었습니다”를, “hello” 뒤에

“인사가 종료되었습니다”를 출력하려고 합니다. 예제로 구현해

보겠습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# 함수 데코레이터를 생성합니다.
def test(function):
   def wrapper():
       print(“인사가 시작되었습니다.”)
       function()
         print(“인사가 종료되었습니다.”)
   return wrapper
# 데코레이터를 붙여 함수를 만듭니다.
@test
def hello():
    print(“hello”)
# 함수를 호출합니다.
hello()
cs

test() 함수에서 wrapper()함수를 리턴하므로, 최종적으로

hello에 함수가 들어가 hello() 형태로 호출할 수 있습니다.

간단한 내용을 굳이 왜 이렇게 복잡하게 작성하냐고 할 수

있겠지만, 데코레이터를 사용하면 functools라는 모듈을 사용할

수 있고, 함수 데코레이터를 사용할 때 매개변수 등을 전달할 수 있어

반복되는 구문이 많아질 때 소스의 가독성도 높히고

매우 유용하게 사용할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
# 모듈을 가져옵니다.
from functools import wraps
# 함수로 데코레이터를 생성합니다.
def test(function):
    @wraps(function)
def wrapper(*arg, **kwargs):
    print(“인사가 시작되었습니다.”)
    function(*arg **kwargs)
    print(“인사가 종료되었습니다.”)
    return wrapper
cs