Title:
파이썬
|
edited by
Youngrok Pak
at
10 years, 10 months ago.
<p><a href="루비">루비</a>, <a href="자바스크립트">자바스크립트</a>처럼 높은 생산성을 낼 수 있으면서 그럭저럭 참아줄 만한 성능을 낼 수 있는 언어. Dropbox, Instagram 등은 파이썬을 잘 활용해서 기술적으로 뛰어난 성과를 이루어낸 대표적인 사례. <a href="자바">자바</a>, <a href="C">C</a>와 함께 구글의 3대 공식 프로그래밍 언어이기도 하다.</p>
<p><code class="widget">TableOfContents()</code></p>
<h2><a href="%ED%8C%8C%EC%9D%B4%EC%8D%AC%20%ED%8C%A8%ED%82%A4%EC%A7%80%20%EA%B4%80%EB%A6%AC">파이썬 패키지 관리</a></h2>
<h2>문자 처리</h2>
<h3>인코딩</h3>
<p>파이썬 모듈 .py 파일의 인코딩은 첫 줄의 주석으로 선언한다.</p>
<pre># coding: utf8</pre>
<p>파이썬 2.x에서는 문자열을 처리하는 타입이 str과 unicode 두 가지다. str은 바이트로 인코딩된 문자열이며, unicode는 추상적인 문자셋이다. 따라서 unicode를 str로 변환할 때는 인코딩을 지정해서 encode하며, str을 unicode로 변환할 때는 인코딩을 지정해서 decode한다.</p>
<pre>>>> '한글' # print repr('한글')<br>'\xed\x95\x9c\xea\xb8\x80'<br>>>> print '한글'<br>한글<br>>>> u'한글'<br>u'\ud55c\uae00'<br>>>> print u'한글'<br>한글<br>>>> '한글'.decode('utf8')<br>u'\ud55c\uae00'<br>>>> u'한글'.encode('utf8')<br>'\xed\x95\x9c\xea\xb8\x80'<br>>>> u'한글'.encode('euc-kr')<br>'\xc7\xd1\xb1\xdb'</pre>
<p><a href="파이썬 3">파이썬 3</a>에서는 str이 파이썬 2.x의 unicode 역할을 하며 기존 str은 bytes로 바뀌는데, 이건 이제 문자열이 아니라 바이트 배열에 가깝다. 자바의 String과 byte[]의 관계와 비슷하다고 보면 된다. 참고로 <a href="파이썬 3">파이썬 3</a>에서는 변수명이나 함수명 등의 identifier도 한글을 쓸 수 있다.</p>
<h3>URL Encoding</h3>
<p>URL에 사용할 수 없는 문자를 사용할 수 있는 문자 집합으로 변환하는 것. 이것도 두 가지가 있는데, 공백을 %20으로 변환하는 것과 +로 변환하는 것이 다르다.</p>
<pre>>>> urllib.quote('안녕 python')<br>'%EC%95%88%EB%85%95%20python'<br>>>>urllib.quote_plus('안녕 python')<br>'%EC%95%88%EB%85%95+python'</pre>
<p>URL의 path 부분은 urllib.quote로 해야 하고, 폼 데이터는 urllib.quote_plus가 표준 권고사항이지만 urllib.quote를 써도 괜찮다.</p>
<p>urllib.urlencode는 dict를 urllib.quote를 이용해서 인코딩된 문자열로 바꾼다.</p>
<h3>정규식</h3>
<p>파이썬 정규식에서 다른 정규식과 다른 점은 캡처하는 문자열에 이름을 붙이는 방식이다.</p>
<h3>한글</h3>
<ul>
<li><a href="http://pythonhosted.org/korean/">korean</a> gettext의 한글 특이사항 반영, 초성 분리 등</li>
<li><a href="http://pythonhosted.org/hangulize/">hangulize</a> 외국어의 한글 발음</li>
</ul>
<h2><a href="웹%20개발">웹 개발</a></h2>
<h3>웹 프레임워크</h3>
<p>실용적인 프로젝트를 해야 한다면 <a href="Django">Django</a>를 써라. <a href="http://flask.pocoo.org/">Flask</a>는 쉽고 꽤 편하고 나름 트렌디하지만, 좋은 설계라고 볼 수 없으므로 권하지 않는다. <a href="http://turbogears.org/">TurboGears</a>는 망했다. <a href="http://www.pylonsproject.org/">Pylons</a>는 Pyramid로 이름이 바뀌었지만 역시 망했다. <a href="http://www.tornadoweb.org/en/stable/">Tornado</a>는 반짝 떴다가 지금은 그냥 서버 엔진으로만 쓰이는 경우가 많다.</p>
<p>삽질해가면서 하는 것도 괜찮다면 <a href="https://wiki.python.org/moin/WebFrameworks">파이썬 위키의 WebFrameworks</a>를 뒤져가면서 실험해볼 수 있고, <a href="gevent">gevent</a>나 twisted, eventlet 등으로 좀더 하드코어하게 해볼 수도 있겠다.</p>
<h3>서버</h3>
<p>성능은 <a href="uwsgi">uwsgi</a>가 가장 빠르다. gunicorn은 설정하기 간편하지만 큰 차이는 아니다. gevent를 같이 쓰면 성능 향상을 볼 수 있는 경우가 있다.</p>
<h3>클라우드 호스팅</h3>
<ul>
<li>webfaction</li>
<li>heroku</li>
</ul>
<h3>디플로이</h3>
<p><a href="fabric">fabric</a>이 많이 쓰이지만, <a href="chef">chef</a>나 <a href="puppet">puppet</a> 같은 막강한 기능을 가진 것은 아니고 그냥 ssh streamlining 도구다.</p>
<h2>파이썬 개발 도구</h2>
<p>자동 완성, 소스 찾아가기 등의 문법 지원 기능을 제대로 쓸 수 있는 IDE는 이클립스 <a href="http://pydev.org/">PyDev</a>와 <a href="http://www.jetbrains.com/pycharm/">PyCharm</a> 둘 뿐이다. 이외에는 자동완성을 흉내만 낼 뿐 제대로 되지 않으므로, IDE가 필요하면 다른 것은 살펴볼 필요도 없고 둘 중에 고르면 된다. 최근 <a href="http://pytools.codeplex.com/">Python Tools for Visual Studio</a>도 제대로 문법지원을 해준다는 설이 있다.</p>
<p>문법 지원은 필요 없고 문법 강조(Syntax Highlight)만 잘 되어도 된다면 선택의 폭은 훨씬 넓다. vi도 충분히 괜찮고, <a href="Sublime Text">Sublime Text</a>는 멀티플랫폼을 잘 지원하고 속도가 겁나 빠르며, 무려 파이썬으로 플러그인을 작성할 수 있어 Emacs 부럽지 않다. 물론 그래도 IDE 쪽을 추천한다.</p>
<p>IDE를 쓰더라도 <a href="http://ipython.org/">IPython</a>은 필수.</p>
<h2>XML과 HTML</h2>
<p>현재 <a href="파이썬">파이썬</a>에서 XML 처리의 <a href="de facto standard">de facto standard</a>가 되어가고 있는 것은 <a href="http://lxml.de/">lxml</a>이다. <a href="http://www.xmlsoft.org/">libxml2</a>에 기반하고 있어 다른 XML 라이브러리에 비해 압도적으로 성능이 좋고, <a href="XPath">XPath</a>, <a href="CSS selector">CSS selector</a> 쿼리 등의 지원도 좋다. 다만, XML을 <a href="pythonic">pythonic</a>하게 재해석한 <a href="http://docs.python.org/2/library/xml.etree.elementtree.html">ElementTree</a>의 문법을 사용하는데, 장단점이 있다. <a href="DOM vs ElementTree">DOM vs ElementTree</a>를 참조하라.</p>
<p>XML 표준 DOM API를 쓰고 싶다면 dom의 기본 구현체인 <a href="http://docs.python.org/2/library/xml.dom.minidom.html">minidom</a>을 쓰면 된다. <a href="http://docs.python.org/2/library/xml.dom.minidom.html">minidom</a> 역시 DOM 표준을 다 지원하는 것은 아니지만, 핵심적인 기능은 다 된다. <a href="http://docs.python.org/2/library/xml.dom.minidom.html">minidom</a>에서 <a href="XPath">XPath</a>를 쓰려면 <a href="http://code.google.com/p/py-dom-xpath/">py-dom-xpath</a>을 사용한다. css query는 직접 지원하지는 않고 <a href="http://pythonhosted.org/cssselect/">cssselect</a>로 <a href="XPath">XPath</a> 문법으로 변환한 후 사용하면 된다. <a href="http://lxml.de/">lxml</a>의 xpath는 <a href="http://www.xmlsoft.org/">libxml2</a>의 C 구현체를 사용하므로 속도가빠르지만 <a href="http://code.google.com/p/py-dom-xpath/">py-dom-xpath</a>은 성능이 그리 좋지 않다.</p>
<p>HTML의 경우는 <a href="http://docs.python.org/2/library/xml.dom.minidom.html">minidom</a>의 파서나 <a href="http://lxml.de/">lxml</a>의 html 파서나 둘다 <a href="HTML5">HTML5</a> 문서를 XML 파서처럼 파싱하므로 브라우저가 파싱하는 것과 차이가 있다. <a href="https://github.com/html5lib/html5lib-python">html5lib</a>는 최신 브라우저와 같은 로직으로 HTML을 파싱하며 파싱 결과의 treebuilder로 <a href="http://docs.python.org/2/library/xml.etree.elementtree.html">ElementTree</a>, <a href="http://lxml.de/">lxml</a>, <a href="http://docs.python.org/2/library/xml.dom.minidom.html">minidom</a>을 모두 사용할 수 있다. 순수 파이썬으로 작성되어 성능은 느리다.</p>
<p>HTML을 대충 쉽게 처리하고 싶을 때는 <a href="http://www.crummy.com/software/BeautifulSoup/">BeautifulSoup</a>이 편리하다. 다만, 오랫동안 쓰여왔던 3.x 버전과 최신 버전인 4.x 사이에 차이가 약간 있어서 구글링한 참조 코드들이 그대로 동작하지 않을 수도 있다. PyPI 패키지명도 달라서 3.x는 <code>BeautifulSoup</code>이고 4.x는 <code>beautifulsoup4</code>다. <a href="https://github.com/html5lib/html5lib-python">html5lib</a>이 파싱을 제공하고 트리빌더를 선택할 수 있는 것과 반대로 <a href="http://www.crummy.com/software/BeautifulSoup/">BeautifulSoup</a>은 파서를 선택할 수 있다. 예전에는 HTML을 <a href="pythonic">pythonic</a>하게 사용할 수 있는 라이브러리로 많이 쓰였으나, <a href="http://docs.python.org/2/library/xml.etree.elementtree.html">ElementTree</a>가 널리 쓰이면서 존재 이유가 사라져가고 있다.</p>
<p>이외에 <a href="jQuery">jQuery</a>처럼 쓰기 위한 도구로 <a href="http://pythonhosted.org/pyquery/">pyquery</a>를 비롯한 몇몇 도구가 있다. <a href="http://pythonhosted.org/pyquery/">pyquery</a>는 <a href="http://lxml.de/">lxml</a>을 사용하여 성능과 사용성 모두를 충족시킨 예라고 할 수 있다. 그러나 <a href="jQuery">jQuery</a>가 필요할 정도로 HTML을 진지하게 다루어야 하는 경우에는 <a href="http://lxml.de/">lxml</a>을 쓰기 애매해다. HTML5를 제대로 다루지 못하기 떄문이다. 그러면 결국 <a href="https://github.com/html5lib/html5lib-python">html5lib</a>을 파서로 쓰게 되는데, 그럼 성능 이득은 날아간다. 물론 그래도 pyquery를 이용하면 좀더 편리한 것은 사실.</p>
<h2><a href="TaskQueue">TaskQueue</a></h2>
<p><a href="celery">celery</a>가 좋음.</p>
<h2>HTTP 클라이언트</h2>
<p>파이썬 표준 라이브러리에 urllib, urllib2, httplib 등이 있고 기타 다양한 라이브러리가 있지만 <a href="requests">requests</a>가 천하통일한 상태. 물론 대충 때워도 될 때는 urllib2가 답이다.</p>
<p>좀더 로봇스러운 동작을 쉽게 구현하고 싶은 경우에는 <a href="mechanize">mechanize</a>가 쓸만하다. 좀더 웹 브라우저에 가깝게 HTTP 클라이언트의 역할을 하고 싶다면 <a href="WebDriver">WebDriver</a>를 쓰면 된다. 물론 <a href="WebDriver">WebDriver</a>는 실제 브라우저를 돌릴 수도 있다.</p>
<h2>비동기 통신</h2>
<p><a href="socket.io">socket.io</a>의 파이썬 구현체로 <a href="https://github.com/abourget/gevent-socketio">gevent-socketio</a>가 좋다. <a href="Django">Django</a>와 통합할 때도 django-socketio를 쓰는 것보다 그냥 <a href="https://github.com/abourget/gevent-socketio">gevent-socketio</a>를 가져다가 적당히 붙여서 쓰는 게 더 편하다.</p>
<h2>파서</h2>
<p>간단하게 파서를 만들고 싶을 때는 <a href="pyparsing">pyparsing</a>이 짱이다. lex와 yacc의 파이썬 버전은 여러 가지가 있는데, <a class="http" href="http://www.dabeaz.com/ply/">PLY</a>가 비교적 사용하기 쉽다. 파이썬 코드를 파싱하고 싶을 때는 <code>ast</code> 모듈을 쓰면 된다.</p>