2013년 12월 30일 월요일

Django __in query로 얻은 결과 정렬하기

예를 들어, device_ids = [10, 5, 26, 34, 55] 리스트에 있는 모든 device 목록을 얻은 후 이를 device_ids에 있는 id 순서대로 정렬하고자 한다면 다음과 같이 할 수 있습니다.

device_ids = [10, 5, 26, 34, 55
devices = list(Device.objects.filter(id__in=device_ids))
devices = sorted(devices, key=lambda d: device_ids.index(d.id))

데이터베이스에서 얻은 쿼리 결과는 device_ids에 있는 순서대로 반환되지 않습니다. 그러므로, 이를 list로 변환 후 sorted를 사용하여 정렬을 해주어야 합니다. 이때 정렬의 조건이 되는 key 값은 device_ids 리스트에 저장된 device id의 index로 합니다. 예를 들면, 10번 device id의 경우 index의 값은 0이므로 10번 디바이스가 반환되는 리스트의 가장 선두에 있게됩니다.

참고자료:

2013년 12월 27일 금요일

vim을 Python 에디터로 잘 활용하기

PyCharm과 같은 IDE도 좋지만 간단한 코딩에는 vim만한 에디터가 있을까? Python 코딩에 도움이 되는 vim 팁을 정리해봅니다.


Tab 설정 및 Syntax Color 설정

가장 기본적인 설정부터 살펴봅시다. Python Syntax Color를 지정하기 위해서는 http://www.vim.org/scripts/script.php?script_id=790 사이트에서 python.vim 파일을 다운로드 받아 ~/.vim/syntax/ 폴더에 복사합니다. ~/.vimrc 파일에는 아래와 같이 추가해줍니다.

syntax on
filetype plugin indent on 

Tab 설정은 ~/.vim/ftplugin/python.vim 파일에 아래와 같이 추가해줍니다. (파일이 없다면 새로 생성해주세요)

set tabstop=8
set softtabstop=4
set shiftwidth=4
set textwidth=100
set expandtab
set smartindent cinwords=if,elif,else,for,while,try,except,finally,def,class
set nocindent


Tagging 및 소스코드 브라우징

규모가 제법 큰 Python 프로젝트를 vim으로 편집하기 위해서는 소스 브라우징 기능이 절실합니다. 이 함수가 어느 파일에 구현되어 있는지 어디서 사용하는지 등등 이 파일 저 파일 왔다갔다 하려면 정신없죠. ctgas를 이용하여 tagging file을 만들어주면 vim에서 Python 소스 브라우징이 가능해집니다.

Mac OS X의 경우에는 exuberant ctags를 설치해주어야 합니다. Homebrew를 이용하면 간단하게 설치가 가능합니다.

brew install ctags-exuberant 

설치완료 후 터미널에서 ctags --help를 실행하면 Exuberant Ctags 5.8과 같은 버전 정보가 보일겁니다.

tagging file을 만드는 방법은 간단합니다. 원하는 프로젝트 폴더에서 ctags -R 을 실행하면 됩니다. 단, 이렇게하면 tagging에 Python 코드의 변수, import된 패키지 이름 정보도 함께 포함됩니다. tagging 정보에는 클래스와 함수만 포함되는 것이 코드 브라우징을 사용하기 수월합니다. 이를 위해 ~/.ctags 파일에 아래와 같은 내용을 추가합니다.

--python-kinds=-iv
--exclude=build
--exclude=dist

위 설정에서 -iv 옵션이 import와 변수(variable)를 tagging 대상에서 제외시키는 역할을 합니다. --exclude 옵션은 tagging시 제외할 폴더를 지정할 수 있습니다.


Auto Completion 기능

Jedi 플러그인을 설치하면 vim에서 Python 코드 자동완성 기능을 사용할 수 있습니다. 설치 방법은 아래와 같습니다.

1. Vundle 플러그인을 설치합니다.
git clone https://github.com/gmarik/vundle.git ~/.vim/bundle/vundle

2. ~/.vimrc 파일을 다음과 같이 수정합니다.
syntax on
set nocompatible              
filetype off                  

set rtp+=~/.vim/bundle/vundle/
call vundle#rc()
" let Vundle manage Vundle
" " required! 
Bundle 'gmarik/vundle'
" " My bundles here:
Bundle 'davidhalter/jedi-vim'

filetype plugin indent on     " required!

3. vim을 실행 후 :BundleInstall을 실행합니다.

참고자료:

2013년 12월 24일 화요일

pip - Python 패키지 관리

크리스마스 이브지만 내침김에 pip까지 정리해보도록 하겠습니다. Python 개발자라면 자주 사용하시는 도구라 익숙한 내용이실겁니다.

1. 패키지 설치하기 - 설치하려는 패키지 이름을 알고있다면 간단합니다. 아래는 Django 패키지를 설치하는 경우입니다만 django와 같이 대소문자 관계없이 이름을 적어주어도 됩니다.
  • pip install Django 
특정 버전을 설치하려면 아래와 같이 해주세요.
  • pip install Django==1.5.5 
2. 패키지 찾아보기 - 원하는 패키지 이름이 확실치 않은 경우에는 검색을 해볼 수도 있습니다.
  • pip search mysql  
3. PyPI 인덱스에 없는 오픈소스 패키지를 설치하려면 직접 archive 파일의 경로를 지정하여 설치할 수도 있습니다.
  • pip install https://dpkt.googlecode.com/files/dpkt-1.8.tar.gz 
4. virtualenv 글에서 살펴본바와 같이 pip으로 설치한 패키지 목록을 얻을 수 있습니다.
  • pip freeze 
5. pip freeze가 출력한 내용을 text 파일로 저장해두면 다른 개발 환경에서 text 파일안에 있는 모든 패키지를 한번에 손쉽게 설치할 수 있습니다.
  • pip install -r requirements.txt 
6. 현재 설치된 패키지를 최신버전으로 업데이트하거나 삭제도 간단합니다.
  • pip install --upgrade pylint 
  • pip uninstall pylint  

안타깝게도 개발환경이 Windows 운영체제인 경우라면 ActiveState Python을 설치하면 pip이 기본적으로 설치되어 있으니 참고하시길. (그리고, 되도록이면 Mac OS X이나 Linux 환경으로 전향하시길...)

참고:

virtualenv를 사용하자 - 가상 개발환경 구축하기

Python 개발 환경을 각 프로젝트별로 분리시키고 싶다면? virtualenv를 사용하면 됩니다. 예를 들어, 새로 시작한 프로젝트에 Django v1.5.5, Numpy v1.7.1이 필요한 경우 전체 시스템에 해당 패키지를 설치할 필요없이 virtualenv로 해당 프로젝트만을 위한 가상 개발환경을 만들 수 있어요. 사용법은 간단합니다.


기본적인 사용법

  • sudo pip install virtualenv
  • 작업할 폴더를 생성합니다.
  • 해당 폴더로 이동하여 virtualenv venv와 같이 실행하면 venv 폴더가 생길겁니다.
  • Shell에서 . venv/bin/activate 명령을 실행해주세요. Shell prompt에 (venv)라는 표시가 보여 가상환경 안에 있음을 알려줍니다. 
  • 가상환경 안에 설치하는 모든 Python package는 해당 프로젝트의 venv 폴더안에 설치되고 이 가상환경 안에서만 사용할 수 있습니다.
  • venv 폴더를 지우면 가상환경에 설치한 모든 package를 다 삭제할 수 있어요. HDD 공간이 아쉽고 더이상 프로젝트에 쓸시간이 없다면 싹 지워버리세요.


다른 컴퓨터에 동일한 개발환경 구축

virtualenv를 사용하면 개발환경을 다른 컴퓨터로 그대로 옮기는 작업도 아주 쉽습니다. 아시죠 이거 나름 골치아픈일인거...

1. virtualenv 환경안에 설치된 package 목록 리스트를 얻을 수 있습니다.
  • pip freeze > requirements.txt
2. txt 파일에는 아래와 같이 가상환경에 설치된 package들의 이름과 버전이 기록되어집니다.
Django==1.5.5
IPy==0.81
MySQL-python==1.2.4
PyYAML==3.10
South==0.8.2
astroid==1.0.1
boto==2.4.1

3. 새로운 개발환경에 virtualenv를 설치하고 앞에 설명한 것처럼 가상환경을 만들어줍니다. 그런 후 pip을 이용하여 필요한 package를 설치합니다.
  • pip install -r requirements.txt

다른 버전의 Python 인터프리터 사용

Python 인터프리터의 버전 별 가상환경 구축도 가능합니다. Python 3.3 버전의 가상환경을 구축하고 싶다면.
  • virtualenv --python=python3.3 venv

소스코드를 이용하여 virtual environment에 설치

다운로드 받은 Python 소스코드를 virtual environment에 설치할 수도 있습니다.

1. 소스코드를 temp 폴더에 저장합니다. 예: scrapy 패키지를 scrapy_temp 폴더에 저장
2. temp 폴더(scrapy_temp)로 이동합니다.
3. setup.py를 설치하려는 가상환경의 python 인터프리터로 실행합니다.
~/myworks/test_prj/venv/bin/python setup.py install

위 경우에는 scrapy 패키지가 test_prj 가상환경에 설치 됩니다.

2013년 12월 15일 일요일

이 블로그에서 다룰 내용들 (draft)

이 블로그에서는 Python 언어의 문법과 같은 기본적인 내용들을 다루지는 않을 생각입니다. 실제 소프트웨어 개발 시 유용한 Python 패키지 및 도구의 사용법에 대해 정리해보고 분야별 적용 사례 등을 다룰 예정입니다. 지금 생각하고 있는 내용들은 아래와 같습니다.
  • Python 가상 개발 환경 구축하기 – virtualenv
  • Python 패키지 관리하기 – pip
  • Python용 에디터 설정하기 - vim
  • Interactive한 Python shell – ipython
  • Python 코드 unit 테스트 작성하기 - nose
  • Python 코드의 커버리지 확인하기 – coverage
  • Python 코드 문서화 하기 – sphinx
  • 아주 심플한 web application 개발하기 – Flask
  • 조금 복잡한 web application 개발하기 – django
  • Django application의 DB query 성능 최적화 - django-debug-toolbar
  • Amazon Web Service를 이용하기 – AWS EB
  • Google App Engine를 이용한 Web App 개발
  • 네트워크 테스트 도구 개발하기 – Scapy
  • Git 연동하기
  • 등등등 …