파이썬 프로그램의 형태 - 파이썬 배우기 :: Python일반[SSISO Community]
 
SSISO 카페 SSISO Source SSISO 구직 SSISO 쇼핑몰 SSISO 맛집
추천검색어 : JUnit   Log4j   ajax   spring   struts   struts-config.xml   Synchronized   책정보   Ajax 마스터하기   우측부분

Python일반
[1]
등록일:2015-05-29 09:01:48 (0%)
작성자:
제목:파이썬 프로그램의 형태 - 파이썬 배우기
어떤 프로그램밍 언어로 프로그램을 제작하더라도 본격적인 프로그램 제작 이전에 어떤 형태의 프로그램을 만들 것인지 방향성을 결정하는 것은 상당히 중요하다. 프로그램의 동작방식, 연관 범위, 인터페이스에 따라 프로그램의 구현 방식과 규모 등에 있어 큰 차이가 있기 때문에 파이썬을 배워나가는 사람의 입장에서도 이 부분에 대한 이해가 필수적이다 하겠다. 결론을 먼저 말한다면 파이썬은 단순 배치 프로그램 부터 시작하여 GUI 프로그램 및 웹 서비스까지 모든 분야에서 사용할 수 있다는 점이다. 다음은 사용자와의 인터페이스 관점에서 바라본 프로그램의 종류이다.
 

* 일괄 작업 프로그램


명령행(command line)에서 프로그램을 실행시키면 끝날때까지 더이상 사용자와의 대화가 필요없는 프로그램으로  간단히 파일을 변환시키거나 분석하는 도구로 부터 데이터베이스를 백업하거나 계좌를 결산하는 프로그램까지 다양한 응용이 가능하다.
 

* 단순 문자 대화형 프로그램


파이썬의 기본 입출력 명령인 raw_input(), input(), print()등을 활용하여 간단하게 사용자와 대화하며 작업을 수행하는 형태이다. 설치 프로그램 등에 활용할 수 있다.
 

* 쉘 대화형 프로그램


파이썬의 cmd나 shlex등을 이용하여 쉘처럼 구조화된 명령을 입력받고 파싱과정을 거쳐 사용자가 요구한 명령을 수행하는 형태로 동작한다. 복잡한 명령을 입력하면 내부에서 파싱 과정을 거쳐 서비스를 수행하는 구조이다. 파이썬 인터프리터, 데이터베이스 쿼리를 수행하는 클라이언트 프로그램이나 관리도구가 이런 형태를 갖는다.
 

* TUI(Text User Interface) 프로그램


Curses라는 터미널 제어 라이브러리를 통해서 문자 기반이기는 하지만 윈도우 기반 표시나 기타 다양한 고급형 인터페이스를 구현하는 프로그램이다.  파이썬도 curses 모듈을 제공하고 있으나 운영체제 간에 차이가 있음에 주의해야 한다.
 

* GUI(Graphical User Interface) 프로그램


윈도우 운영체제에서 사용자가 클릭하여 실행시키는 대부분의 프로그램 처럼 그래픽 기반으로 동작하는 프로그램이다. 파이썬에서 GUI 프로그램을 만드는 방법은 GUI 툴킷 또는 프레임워크로 어떤 것을 사용하는가에 따라 다양하다(http://wiki.python.org/moin/GuiProgramming 참조) 각 툴킷 마다 장단점이 있기 때문에 신중한 선택이 필요하다. 파이썬은 Tcl/Tk기반의 TkInter를 기본 제공하고 있으며, 이외에도 Qt 기반의  PyQt, wxWidgets 기반의 WxPython 등을 대표적인 툴킷으로 들수 있는데 이들의 공통점은 운영체제 독립적이라는 것이다. 즉 이들 툴킷을 활용하여 제작한 파이썬 GUI 프로그램은 운영체제와 관계없이 동일하게 동작한다는 것이다.
 
GUI 프로그램을 만들때 제일 먼저 떠오르는 것은 비주얼스튜디오처럼 IDE에서 손쉽게 화면을 구성하면서 프로그램을 만들수 없을까 하는 것인데 파이썬에서도 이런 필요를 채워주는 도구들이 있다. 관련된 오픈소스 패키지를 나열하면 아래와 같다.
  • Monkey Studio : http://monkeystudio.org/ PyQt4 기반으로 아래의 그림은  Monkey Studio 1.9.0.4와  PyQt4-4.10 를 설치한 이후  GUI 화면을 디자인하는 화면과 예제의 실행결과이다.
    사용자 삽입 이미지

  • Rapyd-Tk : http://www.bitflipper.ca/rapyd/  Tkinter 기반
  • Visual Tkinter Python IDE : http://sourceforge.net/projects/visualtkinter Tkinter 기반
  • wxGlade : http://wxglade.sourceforge.net/  wxPython 기반의 GUI 빌더(완전한 형태의 IDE는 아니다)
  • Boa Constructor : http://boa-constructor.sourceforge.net/ wxPython 기반의 IDE
  • Glade + PyGTK : http://glade.gnome.org/ GUI 빌더 Glade로 인터페이스를 작성하여 GTK+ 오브젝트를 생성하고 PyGTK에서 코드를 작성하는 방식으로 개발한다.

 
지금까지 살펴보았듯이 파이썬에서의 GUI 프로그램 개발은 어떤 툴킷 또는 프레임워크를 선택할것인지가 결정적 요소로 작용한다. 특정 운영체제에 전문화된 툴킷도 있지만 파이썬에서 적용하는 GUI 툴킷은 대부분 어떤 운영체제에서도 사용할 수 있는 플랫폼 독립성을 가진다. 툴킷과의 인터페이스를 감안하여 Tkinter, PyQt, PyGTK, wxPython 등을 적절하게 선택하고 관련 툴킷에 대한 사전 스터디가 선행되어야 한다. 이들을 위젯 툴킷이라고도 하는데 대표적인 툴킷들에 대하여 간단하게 정리해 보면 아래와 같다.
 
  • Qt : https://qt-project.org/  노키아에서 시작하여 2012년 Digia로 이전되었다. 기존 운영체제에 더해서 안드로이드, iOS, Windows8등에도 적용 예정이다. 현재 Qt5까지 릴리즈 되었다. GPL 라이선스. http://qt-apps.org/ 에서 다양한 응용 프로그램을 확인해 볼 수 있다.
    http://www.diotavelli.net/PyQtWiki/SomeExistingApplications에서는 PyQt로 제작한 응용들을 볼 수 있다.
  • Tk : http://www.tcl.tk/ 1991년 Tcl언어의 확장 형태로 유닉스 X11용으로 시작해서 타운영체제로 확장되었다. Qt나 GTK+의 시초라 할 수 있다. 현재 8.6까지 릴리즈되었다, BSD 라이선스
  • GTK+ : http://www.gtk.org/ GIMP Toolkit으로 GIMP에 사용할 목적으로 시작했으나 다양한 분야로 확장되고 있다. 현재 3.8.0까지 릴리즈되었으며 LGPL 라이선스이다. GNOME 데스크탑, GIMP, Inkscape 등의 대표적인 적용사례가 있다. PyGTK 응용은 http://www.pygtk.org/applications.html 에서 확인할 수 있다.
  • wxWidgets : http://www.wxwidgets.org/  이전 이름은 wxWindows로 여러 운영체제에서 다양한 시도가 이루어 지고 있다.  현재 2.8.12까지 릴리즈 되었고 LGPL 라이선스이다. Audacity를 비롯한 다양한 적용 사례가 있다. (http://www.wxwidgets.org/about/screensh.htm)


 
 

* 웹 기반 프로그램


웹브라우저를 통해서 사용자 인터페이스를 제공하는 것으로 웹서버측에서 프로그래밍이 필요하고 아래와 같이 다양한 적용 방법이 있다.
(참고 자료 http://docs.python.org/2/howto/webservers.html)
  • CGI(Common Gateway Interface)
  • mod_python
  • FastCGI, SCGI
  • mod_wsgi
  • Templates
  • Frameworks

 
- CGI
웹서버와 프로그램간의 가장 전통적인 인터페이스로 속도 및 기타 문제로 사용할 수 있지만 추천하지 않고 WSGI를(Web Server Gateway Interface) 사용하도록 제안하고 있다. 가장 간단히 CGI를 테스트 해볼 수 있는 방법은 파이썬에 내장되어 있는 자체 서버(CGIHTTPServer)를 사용하는 것으로 아래의 그림과 같이 파이썬 폴더로 이동하여 "python -m CGIHTTPServer"로 실행시키면 8000포트로 웹서버가 가동된다.
웹브라우저에서 프로그램을 테스트하기 이전에 파이썬 폴더에 "cgi-bin"이름의 폴더를 생성하고 그아래에 hello.py코드를 아래와 같이 작성한다.
#!D:\Python27\python.exe
print 'Content-Type: text/html'
print
print '<html>'
print '<head><title>Hello Python</title></head>'
print '<body>'
print '<h1>Hello Python</h1>'
print '</body>'
print '</html>'

 
cgi-bin/hello.py가 준비되었으면 웹브라우저에서 "http://127.0.0.1:8000/cgi-bin/hello.py"로 입력하면 결과를 아래와 같이 확인할 수 있다.
사용자 삽입 이미지
사용자 삽입 이미지



 
 
파이썬 자체 웹서버가 아닌 아파치 같이 전문 웹서버의 경우에도 크게 다르지 않다. 아파치 웹서버를 가동시키고 아파치의 cgi-bin 폴더에 위에서 작성한 hello.py를 복사해두고(소스 코드의 첫 라인에 파이썬 인터프리터의 경로를 정확히 입력해야 정상 동작한다) 아파치의 가동 포트를 특별히 변경하지 않았다면 80포트를 사용하므로 웹브라우저에서 "http://127.0.0.1/cgi-bin/hello.py"로 테스트하면 동일한 결과를 확인할 수 있다.
 
위의 테스트처럼 CGI를 사용하면 그때마다 인터프리터가 로딩되어야 하는 문제가 있다. 아무튼 파이썬에서 CGI를 사용하려면 cgi, cgitb 모듈을 통해 사용자 입력을 다룰수 있고  print 함수를 통해 표준 출력으로 내보내면 그 결과가 웹브라우저로 전달되는 방식이다.
 
 
- mod_python(http://www.modpython.org/)
파이썬 인터프리터를 아파치 웹서버에 내장시켜 인터프리터 로딩에 따른 시간을 낭비를 줄이고 웹서버와의 인터페이스가 좀더 용이하도록 기능을 제공한 것이다.  "<!--#python -->" 형식으로 SSI(Server Side Includes) 기능을 사용할 수 있도록 기능을 제공한다. mod_python을 아파치에 정상적으로 설치한다음 mod_python 관련 설정이 필요한데, mod_python의 일반 핸들러인지 Publisher 핸들러인지에 따라 설정 및 사용법에 차이가 있다.
 
아래는 Publisher 핸들러의 설정과 입력폼 그리고 파이썬 코드인데 입력폼에 파이썬 코드내의 어떤 함수를(form.py/email) 통해 기능을 수행할 것인지를 지정하고 mod_python에서 해당 함수로 웹 브라우저에서 전달한 입력을 인수로 전달하는 것을 확인할 수 있다.(http://www.modpython.org/live/current/doc-html/tut-pub.html 참조)
 
AddHandler mod_python .py
  PythonHandler mod_python.publisher
  PythonDebug On

 
   <html>
      Please provide feedback below:
  <p>                          
  <form action="form.py/email" method="POST">

      Name:    <input type="text" name="name"><br>
      Email:   <input type="text" name="email"><br>
      Comment: <textarea name="comment" rows=4 cols=20></textarea><br>
      <input type="submit">

  </form>
  </html>

import smtplib

WEBMASTER = "webmaster"   # webmaster e-mail
SMTP_SERVER = "localhost" # your SMTP server

def email(req, name, email, comment):

    # make sure the user provided all the parameters
    if not (name and email and comment):
        return "A required parameter is missing, \
               please go back and correct the error"

    # create the message text
    msg = """\
From: %s                                                                                                                                          
Subject: feedback
To: %s

I have the following comment:

%s

Thank You,

%s

""" % (email, WEBMASTER, comment, name)

    # send it out
    conn = smtplib.SMTP(SMTP_SERVER)
    conn.sendmail(email, [WEBMASTER], msg)
    conn.quit()

    # provide feedback to the user
    s = """\
<html>

Dear %s,<br>                                                                                                                                      
Thank You for your kind comments, we
will get back to you shortly.

</html>""" % name

    return s

 
아래는 mod_python의 일반  핸들러와 관련한 설정과 파이썬 코드 예제이다.
  <Directory /mywebdir>
      AddHandler mod_python .py
      PythonHandler myscript
      PythonDebug On
  </Directory>

from mod_python import apache

def handler(req):

    req.content_type = "text/plain"
    req.write("Hello World!")

    return apache.OK

 
아래는 PSP(Python Server Pages)  핸들러와 관련한 설정과 파이썬 코드 예제로 PHP, ASP, JSP처럼 태그를 가지고 HTML코드와 파이썬 코드를 병기할 수 있다. PSP에서의 태그는 <% %>로 사용한다. 표현식은 <%= %>로 include 같은 지시자는 <%@ %>를 사용한다.
AddHandler mod_python .psp
PythonHandler mod_python.psp

<html>
<%
import time
%>
Hello world, the time is: <%=time.strftime("%Y-%m-%d, %H:%M:%S")%>
</html>



- FastCGI, SCGI(http://httpd.apache.org/mod_fcgid/)
CGI의 성능 문제를 웹서버에 인터프리터를 내장하는 것이 아닌 다른 방식으로 풀어 보려는 시도로 인터프리터를 웹서버에 내장하는 것이 아니라 대몬 형태로 가동시켜두고 웹서버에 내장한 인터페이스 모듈을 통해서 상호 통신하는 방식이다. SCGI는 단순히 "Simpler FastCGI"의 의미로 이해해도 된다. FactCGI나 mod_python 모두 직접 사용되기 보다 WSGI 적용에 활용되는 형태로 이용된다. 아파치에서는 mod_fcgid 모듈을 제공하고 있다.
  
- mod_wsgi(https://code.google.com/p/modwsgi/)
WSGI(Web Server Gateway Interface,  http://www.wsgi.org/ 참조)는  웹 서버와 응용 프로그램 간의 규약(specification)으로 서버와 응용 측면에서 각각의 인터페이스를 정의하고 있다.(PEP333) WSGI 서버는 클라이언트 요청을 WSGI 응용에 전달하고 WSGI 응용에서 전달한 결과를 클라이언트로 응답하는 역할을 담당하는 것으로 파이썬에 내장한 웹서버로도 WSGI 테스트가 가능하지만 mod_wsgi를 추천하고 있다. CGI, FastCGI, SCGI, mod_python 등이 WSGI 응용을 구현하기 위한 게이트웨이로 사용된다면, mod_wsgi는 이런 게이트웨이 없애고 웹서버에 직접 WSGI 응용을 내장한 것이다.
 
mod_wsgi는 아파치 프로세스에 직접 내장하는 방식과 FastCGI 처럼 대몬 형태로 동작하는 두가지 모드로 사용할 수 있다. 성능은 내장형이 좋지만 안정성을 위해서는 대몬 모드를 추천하고 있다. 아래는 Trac을 mod_wsgi에서 구동시키기 위한 WSGI 스크립트(*.wsgi)와 아파치 설정 파일 예제이다(http://trac.edgewall.org/wiki/TracModWSGI 참조)
import os

os.environ['PYTHON_EGG_CACHE'] = '/usr/local/trac/mysite/eggs'

import trac.web.main
def application(environ, start_response):
  environ['trac.env_path'] = '/usr/local/trac/mysite'
  return trac.web.main.dispatch_request(environ, start_response)

WSGIScriptAlias /trac /usr/share/trac/cgi-bin/trac.wsgi
<Directory /usr/share/trac/cgi-bin>
    WSGIApplicationGroup %{GLOBAL}
    Order deny,allow
    Allow from all
</Directory>


- Templates
파이썬 코드만으로 웹페이지 작성하는 것은 디자인을 입히는 것도 쉽지 않고 일일이 코딩해야 하는 어려움이 있다. 그래서 통상 도구를 활용하여 웹페이지를 작성하고 페이지내 특정한 곳에 코드를 삽입하여 조립하는 방식을 취한다. 파이썬에서는 %연산자로 조립하거나 string 모듈의 Template을 활용하는 방법을 제공하고 있고 복잡한 템플릿을 위해 템플릿 엔진을 사용할 수 있다. 데이터 내용의 수정없이  웹페이지의  디자인만 바꾼다면 파이썬 코드를 손 대지 않고 템플릿 파일만 수정하면 된다. 다음은 대표적인 템플릿 엔진들이다. 
  • Mako : http://www.makotemplates.org/ python.org 사이트에 적용되었고 Pylons, Pyramid 프레임워크의 기본 템플릿이다.
    아래는 템플릿 예제이다.

<%inherit file="base.html"/>
<%
    rows = [[v for v in range(0,10)] for row in range(0,10)]
%>
<table>
    % for row in rows:
        ${makerow(row)}
    % endfor
</table>

<%def name="makerow(row)">
    <tr>
    % for name in row:
        <td>${name}</td>\
    % endfor
    </tr>
</%def>

  • Genshi : http://genshi.edgewall.org/ Trac의 템플릿으로 시작하여 확장되고 있다. 아래는 trac의 기본 템플릿 예제이다.

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:py="http://genshi.edgewall.org/"
      xmlns:xi="http://www.w3.org/2001/XInclude">
  <head>
    <title>Available Projects</title>
  </head>

  <body>
    <h1>Available Projects</h1>
    <ul>
      <li py:for="project in projects" py:choose="">
        <a py:when="'href' in project" href="$project.href"  title="$project.description">$project.name</a>
        <py:otherwise>
          <small>$project.name: <em>Error</em> <br /> ($project.description)</small>
        </py:otherwise>
      </li>
    </ul>
  </body>
</html>

  • Jinja : http://jinja.pocoo.org/docs/ Django 프레임워크의 템플릿으로 시작하여 확장되고 있다. 아래는 템플릿 예제이다.

<title>{% block title %}{% endblock %}</title>
<ul>
{% for user in users %}
  <li><a href="{{ user.url }}">{{ user.username }}</a></li>
{% endfor %}
</ul>

  
- Frameworks
개발자로 하여금 세세한 부분에 대한 처리를 하지 않아도 손쉽게  웹 사이트를 개발할 수 있도록 여러 패키지와 모듈을 묶어 놓은 것으로 대표적인 프레임워크로는 Django(https://www.djangoproject.com/), TurboGears(http://www.turbogears.org/),  Zope2(https://pypi.python.org/pypi/Zope2)등이 있다.
[본문링크] 파이썬 프로그램의 형태 - 파이썬 배우기
[1]
코멘트(이글의 트랙백 주소:/cafe/tb_receive.php?no=34442
작성자
비밀번호

 

SSISOCommunity

[이전]

Copyright byCopyright ⓒ2005, SSISO Community All Rights Reserved.