Vim 에서 파이썬 스크립트 바로 실행하기

…라고 제목을 쓰면 Vim을 파이썬 IDE로 탈바꿈 시키는 위대한 플러그인 들을 사용하는 방법을 말하는 것 같아서 약간 낚시 같지만, vi 쓰기 시작한지도 얼마안되는데 이런 플러그인 들은 찾기도, 설정하는 것도 어려워서 포기.

사실 파이썬 코드 작성하는데는 IDLE이 그리 부족하다고 생각하지도 않지만, 그래도 왠지 vi에 애착이 가기 시작하는데, 작성한 코드를 따로 실행하는 게 너무 번거롭다. 따라서 해결책은 현재 편집중인 스크립트를 저장하고 실행하는 명령을 다른 키에 맵핑해주면 된다는 것.

:map <F2> :w<Enter>:!python %<Enter>

라고 실행해주고 일단 한 번 파일을 저장한 후, F2 키를 눌러주면 끝. %는 현재 편집중인 파일의 파일 이름을 말한다. MacVim에서는 Vim의 명령 줄 아래로 결과가 출력되는 것을 볼 수 있다.

[Python] SQLite 데이터베이스에 미리 manipulate 하기

영어사전 류의 앱을 만들 때는 미리 데이터를 정제하여 데이터베이스에 밀어 넣어 두는 것이 필요하다. 예를 들어 엑셀 파일이나 텍스트 파일등에 들어있는 데이터가 있다고 한다면 미리 sqlite 파일로 옮겨놓는 작업에 대해 잠깐 메모한다.

먼저 데이터 베이스 파일을 생성한다. 데이터베이스 파일의 생성은 firefox의 sqlmanager를 사용하여 GUI를 통해 생성할 수도 있다. 만약 필드 수가 많다면 일일이 코드를 타이핑하여 스크립트를 만드는 것보다 이를 사용하는 것이 훨씬 쉽다. 그렇지 않다면 다음과 같이 간단히 테이블 생성 쿼리를 보내 DB파일을 생성하는 스크립트를 실행해 준다.

#preparing DB
import sqlite3

filename = 'dictionary.sqlite'
db = sqlite3.connect(filename)
query = '''CREATE TABLE IF NOT EXISTS KRDIC (
ID INT PRIMARY KEY NOT NULL AUTOINCREMENT,
KEYWORD TEXT,
DESCRIPTION TEXT);'''
cursor = db.cursor()
cursor.excute(query)
db.commit()
db.close()

만약 원본 데이터가 엑셀에 있다면 엑셀을 사용해서 각 셀이 탭으로 구분된 텍스트 파일로 저장한다. SQLite에 넣으려면 기본적으로 UTF-8로 인코딩되어야 하는데, 엑셀이 유니코드를 지원하는지는 잘 모르겠다. 아마 CP949로 인코딩된 한글 텍스트 파일일 가능성이 크다. 따라서 스크립트 내에서 인코딩 문제는 처리해야 한다.

아래 스크립트의 주요 내용은 이러하다.

  1. 텍스트 파일을 열고 한 줄의 내용을 읽어들인다.
  2. 한 줄의 내용을 탭 문자로 분리하여 리스트(배열)로 만든다.
  3. KEY 값으로 주기 위해 number 타입 변수를 하나 생성한다.
  4. 각각의 줄에 대해서 KEY 및 각 필드의 값을 추출하여 리스트로 (혹은 튜플로) 만든다.
  5. 루프를 돌면서 한 줄씩 필드의 내용을 DB에 insert 한다
  6. 루프가 끝나면 DB와 파일을 각각 닫는다.
아래는 예제 코드. 마지막 부분의 if __name__ == “__main__”:은 파일을 바로 실행했을 때, 메인 함수처럼 동작하도록 하는 부분이다.
[python]
def fileInsert(sourceFilename = 'kordict.txt'):
db = sqlite3.connect('dictionary.sqlite')
cursor = db.cursor()
f = open(sourceFilename, 'r', encoding='cp949')
l = f.readline()
index = 0
while(l):
    lineItem =  [index,] + l.split('\t')
    recordList = []
    for i in lineItem:
        if (type(i)==type('a')):
            recordList.append(i.encode('utf-8'))
        else:
            recordList.append(i)

    cursor.execute('''INSERT INTO KRDICT VALUES (?,?,?)''', tuple(recordList[0:3]))
    index = index + 1
    try:
        l = f.leadline()
    except:
        print("error")

print("complete")

db.commit()
db.close()
f.close()

if __name__ == "__main__":
fileInsert() 
[/python]

20120224 :: py2exe의 옵션들

오랜만에 파이썬 코드 하나를 exe로 만들면서 사용한 py2exe의 옵션을 정리하는 차원에서 기록.

py2exe

py2exe는 파이썬(Python)으로 작성된 코드를 파이썬이 설치되지 않은 윈도 환경에서 바로 실행할 수 있는 실행파일로 만들어주는 도구입니다. 이 역시 별도의 어플리케이션으로 존재한다기 보다는 파이썬 모듈로 구성되어 있으며, 실행파일을 만들 때의 옵션들을 포함하는 별도의 빌드 스크립트를 짜야 합니다. 자세한 설명은 py2exe의 프로젝트 홈페이지를 참고하면 되겠습니다. 여기서는 옵션에 대한 설명을 요약합니다. 원문은 py2exe 위키에서 가져왔습니다.

옵션항목

  • console : 콘솔EXE[1. 도스 프롬프트 창이 뜨는 형태로 실행되는 프로그램]로 변환할 코드의 목록 (리스트 형태)[3. 파이썬의 리스트는 대괄호로 묶고, 각 항목은 컴마로 구분합니다.]
  • windows : 윈도EXE[2. 윈도창이 뜨는 형태로 실행되는 GUI 프로그램]로 변환활 코드의 목록 (리스트 형태). pyw의 포맷이라면 이 옵션을 선택합니다.
  • service : 윈도 서비스 클래스를 포함하는 모듈의 이름 (리스트 형태)
  • com_server : 윈도 COM 서버 클래스를 포함하는 모듈의 이름 (리스트 형태)
  • zipfile : 실행에 필요한 모듈을 zip 파일의 형태로 묶음. 값을 None으로 주면 실행파일로 묶이고 별도의 zip 파일이 생성되지 않음
  • options : 컴파일에 필요한 옵션을 지정 (사전 형태)[4. 파이썬의 사전(dictionary) 데이터는 중괄호로 묶고, 각 항목은 컴마로 구분되며, 각 항목은 콜론을 짝 지웁니다.] 사전의 형태는 options={“py2exe”:{ “옵션1″:”값1”, “옵션2″:”값2” …},}의 모양입니다.

Options

옵션 항목 중 다시 options 에서 사용되는 값들을 살펴봅니다.

  • unbuffered : 만약 true로 설정하면 표준입출력에서 버퍼를 사용하지 않는 실행 파일을 생성하게 됩니다.
  • optimize : 코드를 최적화 합니다. 0=최적화 안함 , 1=일반적 최적화, 2=추가 최적화
  • include : 포함할 모듈의 이름을 리스트 형태로 지정합니다.
  • packages : 단일 모듈이 아닌 패키지 이름을 리스트 형태로 지정합니다. 여기에 명시된 패키지는 통상 서브 패키지까지 포함합니다.
  • ignore : 패키지나 모듈을 찾다가 없으면 무시할 모듈을 명시합니다.
  • exclude : 제외할 모듈을 명시합니다.
  • dll_exclude : 제외할 DLL 파일을 명시합니다.
  • dist_dir : 최종 바이너리를 생성할 경로를 지정합니다. 기본적으로는 setup.py 파일이 실행되는 디렉토리에 dist 디렉토리를 생성하게 됩니다.
  • compressed : 압축된 zip 파일을 생성할 것인지 여부를 지정합니다. 불리언 값입니다.
  • xref : 불리언 값입니다. 교차 참조를 보여줄 것인지 여부를 지정합니다.
  • bundle_files : 번들링 여부를 결정합니다. 3=번들링하지 않음(디폴트), 2=기본번들링(파이썬 인터프리터를 포함하지 않음), 1=파이썬 인터프리터까지 번들링
  • skip_archive : 파이썬 바이트 코드 파일을 번들에 포함하지 않고 파일시스템에 직접 생성합니다.
  • ascii : (불리언) encodings, codec 패키지를 포함하지 않습니다.
  • custom_boot_script : 실행환경 세팅 후 실행할 파이썬 코드를 명시합니다.

별도의 예제는 표시하지 않습니다. 다만 단일 실행 파일을 생성하는 법을 안내하는 예전 포스팅을 링크합니다.

 

20091204 :: py2exe로 단일 실행 파일 만들기

이전에도 한 번 py2exe 모듈을 사용해서 파이썬 스크립트를 실행가능한 exe 파일로 만드는 부분에 대해서, 언급을 한 적이 있지요. 이렇게 py2exe를 사용하여 실행파일을 작성하면 파이썬 인터프리터가 lib 형태로 함께 만들어집니다. 이 것을 하나의 단일 실행 파일로 만드는 방법을 소개하고자 합니다.

py2exe를 사용하여 빌드 스크립트를 작성할 때 option 값 내에 py2exe 부분에 bundlefiles 옵션을 1로 주게되면 모든 파일을 하나로 묶어주게 됩니다. 여기에 zipfile=none 옵션을 주면 이러한 묶어진 파일이 실행 파일 내부로 들어가게 되지요.

이와 별도로 dll 파일들은 실행 파일 내에 포함이 되지 않는 듯 합니다. NSVCR71.dll 파일 같은 경우는 매우 빈번히 dist 디렉토리에 같이 들어가더군요.

아래 예제를 샘플 삼아 작성해 보시면 됩니다.

#-*-coding:utf-8
#setup.py
from distutils.core import setup
import py2exe, sys

sys.argv.append("py2exe")

setup(console=["somefile.py"],
options={
    "py2exe":{
        "packages" : ["pywinauto", "pywinauto.controls", "pywinauto.application"], "bundle_files":1,
        "optimize":2, 
        } 
    }, 
    zipfile = None 
)

Cruithne님이 지적해 주신 코드 내 오타 수정하였습니다. 감사드립니다. (11.07.10)

20090404 :: 파이썬에서 환경 파일 다루기

얼마전 서브 블로그를 통해서 포스팅한 ‘netsh’를 사용해서 유선랜 설정 바꾸는 스크립트를 만들어서 잘 활용하고 있습니다. 요즘은 집 – 사이트를 왔다 갔다 하고 있어서 하루에 두 번씩은 랜 연결의 ip 설정을 바꿔주게 되는데요, 두 개의 배치 파일을 만들고 입력값에 따라 각각 배치 파일을 실행해주는 파이썬 스크립트를 사용중입니다. 그런데 참 욕심이라는게, 다른 설정을 필요로 하는 경우에도 손쉽게 이를 추가하면 좋겠다는 생각이 들더군요. 그래서 그 스크립트를 업그레이드 하기로 결심했습니다. 외부 설정 파일을 사용하여 여러 군데의 유선 랜 설정 정보를 저장해 두고, 프로그램 실행 시 연결을 선택하여 설정을 바꿀 수 있는 프로그램으로 말이지요. 실제 작동 자체는 딱 2개 라인이면 되겠지만, 설정 파일을 이용하는 것 자체가 해 본 적이 없어서 그런지 만만하지가 않을 듯 합니다.

1. ini 파일을 사용하기

첫번 째로 ini 파일을 사용하는 방법이 있습니다. 사실 많은 분들이 사용하는 방법 중에 하나 입니다. 단순히 메모장으로 설정 파일 편집이 가능하고 간단하게 주석처리하여 설정을 바꿀 수 있는 장점이 존재하지요. 다만 특정한 한 가지씩의 속성 값만을 외부 파일에 정의할 때 간편하고 빠른 방법임에는 분명합니다만, 기본적으로 텍스트 파일에 정보를 담아두는 경우에는 라인 별로 처리하게 되므로 동일한 유형의 여러 가지 데이터를 미리 담아두기에는 다소 어려움이 많습니다. (구분자를 적절히 이용할 수 있겠습니다만, 그러면 사람이 수동으로 설정을 편집하기가 쉽지 않을 수 있지요)

2. py 파일을 반입하기

설정을 하나의 사전 혹은 사전의 리스트 형태로 만들어서 저장하고 변경하는 방법입니다. 실제로 많은 파이썬 프로그램이 채용하고 있는 방식이기도 합니다. 대표적으로 django의 settings.py 파일이 이러한 예에 속하지요. 설정 로딩 자체를 import를 통해서 해버리면 그만입니다. 별도의 파싱이 필요없다는 최고의 장점을 지니고 있지요. 다만, 설정 파일을 수정하면서 오타를 낸다면 프로그램 자체가 설정 파일을 무시하지 못하고 실행이 안되는 문제가 있기는 합니다. 게다가 py2exe 등을 써서 실행 파일로 배포하는 경우, 아마 반입되는 파일들이 함께 컴파일 되는 것으로 알고 있어서 사용할 수 없는 것으로 알고 있습니다.

3.xml  파일을 사용하기

세번 째로 xml 파일을 사용하는 방법을 생각할 수 있습니다. xml 파일로 설정 파일을 대체하는 경우라면, py2exe 등의 툴로 실행 파일을 배포해도 무관하게 쓸 수 있다는 장점이 있고, 설정 편집 기능을 프로그램 자체에서 제공할 수도 있습니다. 게다가 파싱도 minidom과 같은 파서를 사용하면 그만인 부분이 있지요. 물론 형식에 맞지 않는 xml 파일은 오류를 일으킬 수 있지만, 이는 충분히 방어 가능한 수준일 것으로 생각됩니다. 다만, 이러한 파서를 쓰게 되면 실행 파일로 만들어 배포할 때는 용량이 다소 커지지 않을까 생각은 드는 군요. 

대략 이런 세 가지 방법이 생각 납니다. 혹 다른 좋은 아이디어나 방법이 있다면 댓글로 알려주시면 감사하겠습니다. 그리고 혹 저와 같은 필요성을 가지는 분들이 계시다면, 나중에 해당 프로그램을 만들어서 성공하면, 부끄럽지만 살짝 공개해 볼까도 합니다.