우분투 상의 python 2.5.2에서 python-gconf 간단한 예입니다.
배경화면 이미지를 set하며, notify가 제대로 오는지 확인하는 예제입니다.

소스 코드는 다음과 같습니다.

#! /usr/bin/python
import gconf
import sys, time
import gtk

BGPATH = '/desktop/gnome/background/picture_filename'
client = gconf.client_get_default()
client.add_dir('/desktop/gnome/background', gconf.CLIENT_PRELOAD_NONE)

def bg_changed( *args ):
    print '[Notify]', client.get_string( BGPATH )

def set_value( value ):
    client.set_string(BGPATH , value)

if __name__ == '__main__':
    if len( sys.argv ) > 1:
        param = sys.argv[1]
        if param.lower() == "server":
            print "[Server] Waiting........."
            client.notify_add(BGPATH, bg_changed)
            gtk.main()
        else :
            print "[Param]", param
            set_value( param )

즉, 아래와 같이 첫번째 인자로 'server'를 주면 notify를 기다리기만 하고,
다른 값을 주면 해당 값은 배경화면 파일명을 변경합니다.

dsp@dsplinux:/view/tmp$ ./gconf_test.py server
[Server] Waiting.........
[Notify] /home/dsp/Pictures/ss22-hires.jpg
[Notify] /home/dsp/Pictures/01641_sandilandslookoutsunset_1680x1050.jpg

dsp@dsplinux:/view/tmp$ python ./gconf_test.py /home/dsp/Pictures/ss22-hires.jpg
[Param] /home/dsp/Pictures/ss22-hires.jpg
dsp@dsplinux:/view/tmp$ python ./gconf_test.py /home/dsp/Pictures/01641_sandilandslookoutsunset_1680x1050.jpg
[Param] /home/dsp/Pictures/01641_sandilandslookoutsunset_1680x1050.jpg

cf. gconf 모듈이 gtk thread를 사용하므로 import gtk를 하지 않으면 동작을 안합니다.

AND

이번에는 소수를 구하는 또다른 방법을 구현해 보겠습니다.

소수는 예전에 구한 방법 이외에도, '에라토스테네스의 체'라는 방법을 이용해서 구할 수도 있습니다.


그림출처: http://en.wikipedia.org/wiki/Sieve_of_Eratosthenes

이 알고리즘을 설명하자면,
  1. 2에서부터 n까지의 수를 체에 넣고,
  2. 체에서 가장 작은 값을 소수로 체크하고, 그 수의 배수들을 모두 제외시킵니다.
  3. 위 2번 과정을 반복합니다.

여러가지 방법을 사용할 수 있겠지만, 딕셔너리를 이용해서 구현하면 다음과 같습니다.

# -*- coding: utf-8 -*-
import sys

if __name__=="__main__":
    print( sys.version )
    N = int( input("input a number : ") )
    #init
    sieve = {}
    for i in range(2, N+1):
        sieve[i] = 0
       
    # Sieve of Eratosthenes
    for i in range(2, N+1):
        if sieve[i]==0:
            n=2
            while i*n <= N:
                sieve[i*n]=1
                n+=1

    #print results
    for i in range(2, N+1):
        if sieve[i]==0:
            print( i, end="," )
    print()       
    input("press any key")

100을 넣고 실행해 보면 결과는 다음과 같습니다.

3.0 (r30:67507, Dec  3 2008, 20:14:27) [MSC v.1500 32 bit (Intel)]
input a number : 100
2,3,5,7,11,13,17,19,23,29,31,37,41,43,47,53,59,61,67,71,73,79,83,89,97,
press any key


AND

피보나치 수열은 위키피디아에 보면 다음과 같이 정의되어 있습니다.

피보나치 수가 처음 언급된 문헌은 기원전 5세기 인도의 수학자 핑갈라가 쓴 책이다. 한편 유럽에서 피보나치 수를 처음 연구한 것은 레오나르도 피보나치로 토끼 수의 증가에 대해서 이야기하면서 이 수에 대해 언급했다. n 번째 달의 토끼 수는

    * 첫 달에는 새로 태어난 토끼 한 쌍만이 존재한다.
    * 두 달 이상이 된 토끼는 번식 가능하다.
    * 번식 가능한 토끼 한 쌍은 매달 새끼 한 쌍을 낳는다.
    * 토끼는 절대 죽지 않는다.

이때 n번째 달에 a 쌍의 토끼가 있었고, 다음 n+1 번째 달에는 새로 태어난 토끼를 포함해 b 쌍이 있었다고 하자. 그러면 그다음 n+2 번째 달에는 a+b 쌍의 토끼가 있다.

그럼 이 수열을 파이썬에서 구현하면 어떻게 될까요?
다음과 같이 재귀함수를 이용해서 구현할 수 있습니다.

>>> def Fibonacci(n):
    if n<2: return n
    else: return Fibonacci(n-1)+Fibonacci(n-2)


또한 아래와 같이 generator를 이용할 수도 있습니다.
        
>>> def Fibonacci():
    a,b=1,1
    while 1:
        yield a
        a,b=b,a+b

결과출력.       
>>> for i,ret in enumerate(Fibonacci()):
    if i<20: print(i,ret)
    else: break
          
0 1
1 1
2 2
3 3
4 5
5 8
6 13
7 21
8 34
9 55
10 89
11 144
12 233
13 377
14 610
15 987
16 1597
17 2584
18 4181
19 6765
AND

문자열을 암호화하는 방법은 여러가지가 있습니다만,
이번에는 가장 간단한 방법 중 하나인 caesar  암호법을 이용해 보죠.
caesar 암호법은 각각의 알파벳을 나열한 후, 일정한 간격으로 옮기는 방법입니다.
예를 들어, 'GOOD'를 오른쪽으로 하나씩 옮기면 'HPPE'가 되서 알아보기 힘들게 되는 것이죠.

이 문제는 chr과 ord를 이용하면 아래 예제와 같이 간단하게 해결됩니다.

import sys
SHIFT=1

def encrypt( raw ):
    ret = ''
    for char in raw:
        ret+=chr( ord(char)+SHIFT )
    return ret

def decrypt( raw ):
    ret = ''
    for char in raw:
        ret+=chr( ord(char)-SHIFT )
    return ret
   
if __name__=="__main__":
    print( sys.version )
    raw = input("input : ")
    encrypted = encrypt( raw )
    print("encrypted : " + encrypted)
   
    decrypted = decrypt( encrypted )
    print("decrypted : " + decrypted)
    input("press any key")

이 예제에서 어느정도 간격으로 이동할지에 대한 변수는 SHIFT입니다.
즉 현재는 오른쪽으로 1칸 이동하게 짜여져 있는 것입니다.
실행시켜보면 다음과 같이 암호화/복호화가 잘 되는 것을 볼 수 있습니다.

3.0 (r30:67507, Dec  3 2008, 20:14:27) [MSC v.1500 32 bit (Intel)]
input : hello world
encrypted : ifmmp!xpsme
decrypted : hello world
press any key


AND

소수는 1과 자신 이외의 약수를 갖지 않는 정수를 이야기 합니다.
정수를 입력 받아 그 수가 소수인지 아닌지 검사하는 프로그램을 짜 봅시다.

다음과 같이 소수의 정의대로 2에서부터 입력받은 n-1까지 순회하며 나누어 떨어지는지 아닌지 검사하면 간단히 해결됩니다.

import sys
import math

def isPrime(n):
    bPrime = True
    for i in range(2,int(math.sqrt(n))+1):
        if n%i==0:
            bPrime = False
            break
    return bPrime

if __name__=="__main__":
    print( sys.version )
    N = input("input a number : ")
    if isPrime(int(N)):
        print("prime number")
    else:
        print("not prime number")
    input("press any key")

실행해 보면 다음과 같이 동작하는 것을 알 수 있습니다.

3.0 (r30:67507, Dec  3 2008, 20:14:27) [MSC v.1500 32 bit (Intel)]
input a number : 30
not prime number
press any key

3.0 (r30:67507, Dec  3 2008, 20:14:27) [MSC v.1500 32 bit (Intel)]
input a number : 13
prime number
press any key

그러나 이 예제에는 약간 비효율적인 면이 있는데요.
소수검사는 2에서부터 n-1까지 할 필요가 없습니다. 2에서부터 sqrt(n)까지만 하면 충분하죠.
즉 아래와 같이 isPrime 함수를 변경하면 속도가 약간 더 빠르게 됩니다.

import math

def isPrime(n):
    bPrime = True
    for i in range(2,int(math.sqrt(n))+1):
        if n%i==0:
            bPrime = False
            break
    return bPrime

AND

간단하게 2.x에서 3.0으로 변환이 잘 되는지 테스트해보기 위해 다음과 같이
test.py 파일을 작성해 보겠습니다.

def div(a):
  print u"Result :", a/2
num = raw_input("input any number :")
div(int(num))

그럼 test.py 파일을 2to3.py를 이용해서 변환을 해 보겠습니다.

C:\Python30\Tools\Scripts>2to3.py -w test.py
RefactoringTool: Skipping implicit fixer: buffer
RefactoringTool: Skipping implicit fixer: idioms
RefactoringTool: Skipping implicit fixer: set_literal
RefactoringTool: Skipping implicit fixer: ws_comma
--- \Python30\test_.py (original)
+++ \Python30\test_.py (refactored)
@@ -1,4 +1,4 @@
 def div(a):
-  print u"Result :", a/2
-num = raw_input("input any number :")
+  print("Result :", a/2)
+num = input("input any number :")
 div(int(num))
RefactoringTool: Files that were modified:
RefactoringTool: \Python30\test_.py

참고사항.
2to3에 -w 옵션을 주지 않으면 어떻게 변경해야하는지만 화면에 출력하고, 파일에 직접 수정을 가하진 않습니다.

이제 아래와 같이 바뀐 것을 확인할 수 있습니다.

C:\Python30\Tools\Scripts>type test.py
def div(a):
  print("Result :", a/2)
num = input("input any number :")
div(int(num))

다음과 같이 실행도 잘 되는 것을 확인할 수 있네요.

>test.py
input any number :3
Result : 1.5


간단한 프로그램은 이렇게 쉽게 변환이 되지만,
큰 모듈의 경우에는 테스트케이스를 견고하게 짜서 오동작을 하는지 안하는지 체크하는 것이 필수적으로 필요할 것입니다.

또한 2.5 이하의 버전의 코드를 3.0으로 포팅하려면,
우선 2.6으로 코드를 포팅하고, 2.6에서 -3 옵션을 붙여서 실행 한 후, 경고를 처리합니다.
공식문서에서는 위 작업을 완료한 후에 2to3을 사용하는 것을 권장하고 있습니다.


메리 크리스마스~~~
AND

후우, 한동안 포스팅이 뜸했는데요.

오늘은 python 2.x과 3.0의 차이를 살펴보겠습니다.

이전 글에서 썼듯이, 파이썬3000(파이썬3k)이라고도 불리는 파이썬 3.0이 2008년 12월 초에 발표되었습니다.
이번 변경 사항 중에 특히 주목해야할 것은 파이썬 2.x 버전들과 하위 호환성을 전혀 유지하고 있지 않은 것입니다.
실무에 사용하던 분들은 아직 3.0을 적용할 필요성을 못 느끼시는 분들이 많을 것이나,
추후 적용하기 위해서는 차이점을 짚고 넘어가야 할 것입니다.

자료형이나 내부 구성의 변화 등도 크게 변화 했지만, 아무래도 사용자 입장에서는 다음 사항들이 가장 크게 느껴질 것입니다.


* 체감상으로 가장 큰 차이점은 print가 함수형태로 변경된 점입니다.

Old style :
>>> print "welcome to", "python3k"
welcome to python3k

New style :
>>> print( "welcome to","python3k" )
welcome to python3k

또한 입력인자로 다음과 같이 sep, end, file 를 줄 수 있습니다.

>>> print("welcome to","python", sep="~", end="!", file=sys.stderr)
welcome to~python!

이와 유사하게 입출력관련해서 변경된 점들이 많습니다.
raw_input이 input으로 변경되고,
as, with 예약어가 추가되었습니다.
또한 새로운 string formatting을 제공한답니다.

* long type이 없어졌습니다. 즉, int로 통일 되었습니다.

Old :
>>> type(2**31)
<type 'long'>

New :
>>> type(2**31)
<class 'int'>
>>> type(2**40)
<class 'int'>

2.x에서는 sys.maxint 이하의 값은 int로 처리되고 그 이상의 값은 long으로 처리되었는데요,
3.0에서부터는 모두 int로 처리됩니다.

Old :
>>> sys.maxint
2147483647
>>> type( sys.maxint )
<type 'int'>
>>> type( sys.maxint+1 )
<type 'long'>

* int / int 의 결과는 float 으로 처리됩니다.

Old :
>>> 1/2
0
>>> 3/2
1

New :
>>> 3/2
1.5
>>> type(2/2)
<class 'float'>

사실 2.x에서는 int / int의 결과가 int로만 나와서 예상 밖의 결과가 나온 적이 많은데요,
이제는 그럴 일이 적어질 것 같습니다 :)

* String, Unicode 체계가 바뀌었습니다.

2.x에서는 아래 예제와 같이 string과 unicode로 구분이 되었습니다.

>>> type( '가' )         # 일반 string의 경우.
<type 'str'>

>>> type( '가'.decode('utf8') )          # 인코딩을 가지고 있는 스트링을 디코딩한 경우.
<type 'unicode'>

>>> type( u'가' )
<type 'unicode'>        # 유니코드의 경우.


그러나 3.0에서는 아래 예제와 같이 string과 byte로 구분이 됩니다.

>>> type(u'가')
SyntaxError: invalid syntax (<pyshell#13>, line 1)

>>> type('가')
<class 'str'>

>>> type('가'.encode('cp949'))
<class 'bytes'>

즉, 2.x에서는 일반 스트링이 인코딩이 있는 문자열이었고 unicode가 따로 있었는데,
3.0에서는 일반 스트링이 unicode와 동일하며, 인코딩이 있는 문자열은 bytes로 표현됩니다.


이 이외에도 자잘한 변경사항이 많습니다만, 너무 걱정하지 마세요.
2.x에서 3.0으로의 간편한 변환을 위해 2to3 스크립트가 제공된 답니다.
물론 만능은 아니지만 왠만한 코드는 자동으로 변환할 수 있습니다.

다음에는 이 2to3 스크립트에 대해서 한번 짚고 넘어가도록 해 보겠습니다.

AND

python 3.0 릴리즈

개발/python 2008. 12. 4. 15:35
두둥...

python 3.0이 드디어 릴리즈 되었습니다.

http://python.org/download/releases/3.0/

rc3가 나온지 며칠 되지 않아서 곧바로 업뎃 되네요...

2.x와 3.0의 차이는 다음의 문서를 보면 알 수 있습니다.

http://docs.python.org/dev/3.0/whatsnew/3.0.html

휴우 2.x에 익숙해져 있었는데 3.0에 적응하려면 좀 시간이 걸리겠네요~
AND


완벽히 잊고 살아도 될 줄 알았던 것들이 발목을 잡네요.
기회 삼아 레퍼런스용으로 적어놔 봅니다.

EUC-KR(KSC5601) Table 입니다.

python 상에서 확인하려면 다음과 같이 테스트할 수 있습니다.
( 제 환경은 sys.stdin.encoding이 'utf-8'이며, python 버전은 2.6입니다.
3.0이면 좀 다르겠죠 :) )

>>> '각'.decode('utf-8').encode('euc-kr')
'\xb0\xa2'
>>> print '\xb0\xa2'.decode('euc-kr')
'각'


B0

  00  01  02  03  04  05  06  07  08  09  0A  0B  0C  0D  0E  0F

A0

B0

C0

D0

E0

F0

      가    간  갇  갈  갉  갊  감  갑  값  갓  갔  강  갖  갗

  같  갚  갛  개  객  갠  갤  갬  갭  갯  갰  갱  갸  갹  갼  걀

  걋  걍  걔  걘  걜  거  걱  건  걷  걸  걺  검  겁  것  겄  겅

  겆  겉  겊  겋  게  겐  겔  겜  겝  겟  겠  겡  겨  격  겪  견

  겯  결  겸  겹  겻  겼  경  곁  계  곈  곌  곕  곗  고  곡  곤

  곧  골  곪  곬  곯  곰  곱  곳  공  곶  과  곽  관  괄  괆

B1

  00  01  02  03  04  05  06  07  08  09  0A  0B  0C  0D  0E  0F

A0

B0

C0

D0

E0

F0

      괌  괍  괏  광  괘  괜  괠  괩  괬  괭  괴  괵  괸  괼  굄

  굅  굇  굉  교  굔  굘  굡  굣  구  국  군  굳  굴  굵  굶  굻

  굼  굽  굿  궁  궂  궈  궉  권  궐  궜  궝  궤  궷  귀  귁  귄

  귈  귐  귑  귓  규  균  귤  그  극  근  귿  글  긁  금  급  긋

  긍  긔  기  긱  긴  긷  길  긺  김  깁  깃  깅  깆  깊  까  깍

  깎  깐  깔  깖  깜  깝  깟  깠  깡  깥  깨  깩  깬  깰  깸

B2

  00  01  02  03  04  05  06  07  08  09  0A  0B  0C  0D  0E  0F

A0

B0

C0

D0

E0

F0

      깹  깻  깼  깽  꺄  꺅  꺌  꺼  꺽  꺾  껀  껄  껌  껍  껏

  껐  껑  께  껙  껜  껨  껫  껭  껴  껸  껼  꼇  꼈  꼍  꼐  꼬

  꼭  꼰  꼲  꼴  꼼  꼽  꼿  꽁  꽂  꽃  꽈  꽉  꽐  꽜  꽝  꽤

  꽥  꽹  꾀  꾄  꾈  꾐  꾑  꾕  꾜  꾸  꾹  꾼  꿀  꿇  꿈  꿉

  꿋  꿍  꿎  꿔  꿜  꿨  꿩  꿰  꿱  꿴  꿸  뀀  뀁  뀄  뀌  뀐

  뀔  뀜  뀝  뀨  끄  끅  끈  끊  끌  끎  끓  끔  끕  끗  끙  

B3

  00  01  02  03  04  05  06  07  08  09  0A  0B  0C  0D  0E  0F

A0

B0

C0

D0

E0

F0

      끝  끼  끽  낀  낄  낌  낍  낏  낑  나  낙  낚  난  낟  날

  낡  낢  남  납  낫  났  낭  낮  낯  낱  낳  내  낵  낸  낼  냄

  냅  냇  냈  냉  냐  냑  냔  냘  냠  냥  너  넉  넋  넌  널  넒

  넓  넘  넙  넛  넜  넝  넣  네  넥  넨  넬  넴  넵  넷  넸  넹

  녀  녁  년  녈  념  녑  녔  녕  녘  녜  녠  노  녹  논  놀  놂

  놈  놉  놋  농  높  놓  놔  놘  놜  놨  뇌  뇐  뇔  뇜  뇝

B4

  00  01  02  03  04  05  06  07  08  09  0A  0B  0C  0D  0E  0F

A0

B0

C0

D0

E0

F0

      뇟  뇨  뇩  뇬  뇰  뇹  뇻  뇽  누  눅  눈  눋  눌  눔  눕

  눗  눙  눠  눴  눼  뉘  뉜  뉠  뉨  뉩  뉴  뉵  뉼  늄  늅  늉

  느  늑  는  늘  늙  늚  늠  늡  늣  능  늦  늪  늬  늰  늴  니

  닉  닌  닐  닒  님  닙  닛  닝  닢  다  닥  닦  단  닫  달  닭

  닮  닯  닳  담  답  닷  닸  당  닺  닻  닿  대  댁  댄  댈  댐

  댑  댓  댔  댕  댜  더  덕  덖  던  덛  덜  덞  덟  덤  덥

B5

  00  01  02  03  04  05  06  07  08  09  0A  0B  0C  0D  0E  0F

A0

B0

C0

D0

E0

F0

      덧  덩  덫  덮  데  덱  덴  델  뎀  뎁  뎃  뎄  뎅  뎌  뎐

  뎔  뎠  뎡  뎨  뎬  도  독  돈  돋  돌  돎  돐  돔  돕  돗  동

  돛  돝  돠  돤  돨  돼  됐  되  된  될  됨  됩  됫  됴  두  둑

  둔  둘  둠  둡  둣  둥  둬  뒀  뒈  뒝  뒤  뒨  뒬  뒵  뒷  뒹

  듀  듄  듈  듐  듕  드  득  든  듣  들  듦  듬  듭  듯  등  듸

  디  딕  딘  딛  딜  딤  딥  딧  딨  딩  딪  따  딱  딴  딸

B6

  00  01  02  03  04  05  06  07  08  09  0A  0B  0C  0D  0E  0F

A0

B0

C0

D0

E0

F0

  텭  땀  땁  땃  땄  땅  땋  때  땍  땐  땔  땜  땝  땟  땠  땡

  떠  떡  떤  떨  떪  떫  떰  떱  떳  떴  떵  떻  떼  떽  뗀  뗄

  뗌  뗍  뗏  뗐  뗑  뗘  뗬  또  똑  똔  똘  똥  똬  똴  뙈  뙤

  뙨  뚜  뚝  뚠  뚤  뚫  뚬  뚱  뛔  뛰  뛴  뛸  뜀  뜁  뜅  뜨

  뜩  뜬  뜯  뜰  뜸  뜹  뜻  띄  띈  띌  띔  띕  띠  띤  띨  띰

  띱  띳  띵  라  락  란  랄  람  랍  랏  랐  랑  랒  랖  랗

B7

  00  01  02  03  04  05  06  07  08  09  0A  0B  0C  0D  0E  0F

A0

B0

C0

D0

E0

F0

  퇏  래  랙  랜  랠  램  랩  랫  랬  랭  랴  략  랸  럇  량  러

  럭  런  럴  럼  럽  럿  렀  렁  렇  레  렉  렌  렐  렘  렙  렛

  렝  려  력  련  렬  렴  렵  렷  렸  령  례  롄  롑  롓  로  록

  론  롤  롬  롭  롯  롱  롸  롼  뢍  뢨  뢰  뢴  뢸  룀  룁  룃

  룅  료  룐  룔  룝  룟  룡  루  룩  룬  룰  룸  룹  룻  룽  뤄

  뤘  뤠  뤼  뤽  륀  륄  륌  륏  륑  류  륙  륜  률  륨  륩

B8

  00  01  02  03  04  05  06  07  08  09  0A  0B  0C  0D  0E  0F

A0

B0

C0

D0

E0

F0

  툩  륫  륭  르  륵  른  를  름  릅  릇  릉  릊  릍  릎  리  릭

  린  릴  림  립  릿  링  마  막  만  많  맏  말  맑  맒  맘  맙

  맛  망  맞  맡  맣  매  맥  맨  맬  맴  맵  맷  맸  맹  맺  먀

  먁  먈  먕  머  먹  먼  멀  멂  멈  멉  멋  멍  멎  멓  메  멕

  멘  멜  멤  멥  멧  멨  멩  며  멱  면  멸  몃  몄  명  몇  몌

  모  목  몫  몬  몰  몲  몸  몹  못  몽  뫄  뫈  뫘  뫙  뫼

B9

  00  01  02  03  04  05  06  07  08  09  0A  0B  0C  0D  0E  0F

A0

B0

C0

D0

E0

F0

      묀  묄  묍  묏  묑  묘  묜  묠  묩  묫  무  묵  묶  문  묻

  물  묽  묾  뭄  뭅  뭇  뭉  뭍  뭏  뭐  뭔  뭘  뭡  뭣  뭬  뮈

  뮌  뮐  뮤  뮨  뮬  뮴  뮷  므  믄  믈  믐  믓  미  믹  민  믿

  밀  밂  밈  밉  밋  밌  밍  및  밑  바  박  밖  밗  반  받  발

  밝  밞  밟  밤  밥  밧  방  밭  배  백  밴  밸  뱀  뱁  뱃  뱄

  뱅  뱉  뱌  뱍  뱐  뱝  버  벅  번  벋  벌  벎  범  법  벗

BA

  00  01  02  03  04  05  06  07  08  09  0A  0B  0C  0D  0E  0F

A0

B0

C0

D0

E0

F0

      벙  벚  베  벡  벤  벧  벨  벰  벱  벳  벴  벵  벼  벽  변

  별  볍  볏  볐  병  볕  볘  볜  보  복  볶  본  볼  봄  봅  봇

  봉  봐  봔  봤  봬  뵀  뵈  뵉  뵌  뵐  뵘  뵙  뵤  뵨  부  북

  분  붇  불  붉  붊  붐  붑  붓  붕  붙  붚  붜  붤  붰  붸  뷔

  뷕  뷘  뷜  뷩  뷰  뷴  뷸  븀  븃  븅  브  븍  븐  블  븜  븝

  븟  비  빅  빈  빌  빎  빔  빕  빗  빙  빚  빛  빠  빡  빤  

BB

  00  01  02  03  04  05  06  07  08  09  0A  0B  0C  0D  0E  0F

A0

B0

C0

D0

E0

F0

      빨  빪  빰  빱  빳  빴  빵  빻  빼  빽  뺀  뺄  뺌  뺍  뺏

  뺐  뺑  뺘  뺙  뺨  뻐  뻑  뻔  뻗  뻘  뻠  뻣  뻤  뻥  뻬  뼁

  뼈  뼉  뼘  뼙  뼛  뼜  뼝  뽀  뽁  뽄  뽈  뽐  뽑  뽕  뾔  뾰

  뿅  뿌  뿍  뿐  뿔  뿜  뿟  뿡  쀼  쁑  쁘  쁜  쁠  쁨  쁩  삐

  삑  삔  삘  삠  삡  삣  삥  사  삭  삯  산  삳  살  삵  삶  삼

  삽  삿  샀  상  샅  새  색  샌  샐  샘  샙  샛  샜  생  샤

BC

  00  01  02  03  04  05  06  07  08  09  0A  0B  0C  0D  0E  0F

A0

B0

C0

D0

E0

F0

      샥  샨  샬  샴  샵  샷  샹  섀  섄  섈  섐  섕  서  석  섞

  섟  선  섣  설  섦  섧  섬  섭  섯  섰  성  섶  세  섹  센  셀

  셈  셉  셋  셌  셍  셔  셕  션  셜  셤  셥  셧  셨  셩  셰  셴

  셸  솅  소  속  솎  손  솔  솖  솜  솝  솟  송  솥  솨  솩  솬

  솰  솽  쇄  쇈  쇌  쇔  쇗  쇘  쇠  쇤  쇨  쇰  쇱  쇳  쇼  쇽

  숀  숄  숌  숍  숏  숑  수  숙  순  숟  술  숨  숩  숫  숭

BD

  00  01  02  03  04  05  06  07  08  09  0A  0B  0C  0D  0E  0F

A0

B0

C0

D0

E0

F0

      숯  숱  숲  숴  쉈  쉐  쉑  쉔  쉘  쉠  쉥  쉬  쉭  쉰  쉴

  쉼  쉽  쉿  슁  슈  슉  슐  슘  슛  슝  스  슥  슨  슬  슭  슴

  습  슷  승  시  식  신  싣  실  싫  심  십  싯  싱  싶  싸  싹

  싻  싼  쌀  쌈  쌉  쌌  쌍  쌓  쌔  쌕  쌘  쌜  쌤  쌥  쌨  쌩

  썅  써  썩  썬  썰  썲  썸  썹  썼  썽  쎄  쎈  쎌  쏀  쏘  쏙

  쏜  쏟  쏠  쏢  쏨  쏩  쏭  쏴  쏵  쏸  쐈  쐐  쐤  쐬  쐰

BE

  00  01  02  03  04  05  06  07  08  09  0A  0B  0C  0D  0E  0F

A0

B0

C0

D0

E0

F0

      쐴  쐼  쐽  쑈  쑤  쑥  쑨  쑬  쑴  쑵  쑹  쒀  쒔  쒜  쒸

  쒼  쓩  쓰  쓱  쓴  쓸  쓺  쓿  씀  씁  씌  씐  씔  씜  씨  씩

  씬  씰  씸  씹  씻  씽  아  악  안  앉  않  알  앍  앎  앓  암

  압  앗  았  앙  앝  앞  애  액  앤  앨  앰  앱  앳  앴  앵  야

  약  얀  얄  얇  얌  얍  얏  양  얕  얗  얘  얜  얠  얩  어  억

  언  얹  얻  얼  얽  얾  엄  업  없  엇  었  엉  엊  엌  엎

BF

  00  01  02  03  04  05  06  07  08  09  0A  0B  0C  0D  0E  0F

A0

B0

C0

D0

E0

F0

      에  엑  엔  엘  엠  엡  엣  엥  여  역  엮  연  열  엶  엷

  염  엽  엾  엿  였  영  옅  옆  옇  예  옌  옐  옘  옙  옛  옜

  오  옥  온  올  옭  옮  옰  옳  옴  옵  옷  옹  옻  와  왁  완

  왈  왐  왑  왓  왔  왕  왜  왝  왠  왬  왯  왱  외  왹  왼  욀

  욈  욉  욋  욍  요  욕  욘  욜  욤  욥  욧  용  우  욱  운  울

  욹  욺  움  웁  웃  웅  워  웍  원  월  웜  웝  웠  웡  웨

C0

  00  01  02  03  04  05  06  07  08  09  0A  0B  0C  0D  0E  0F

A0

B0

C0

D0

E0

F0

      웩  웬  웰  웸  웹  웽  위  윅  윈  윌  윔  윕  윗  윙  유

  육  윤  율  윰  윱  윳  융  윷  으  윽  은  을  읊  음  읍  읏

  응  읒  읓  읔  읕  읖  읗  의  읜  읠  읨  읫  이  익  인  일

  읽  읾  잃  임  입  잇  있  잉  잊  잎  자  작  잔  잖  잗  잘

  잚  잠  잡  잣  잤  장  잦  재  잭  잰  잴  잼  잽  잿  쟀  쟁

  쟈  쟉  쟌  쟎  쟐  쟘  쟝  쟤  쟨  쟬  저  적  전  절  젊

C1

  00  01  02  03  04  05  06  07  08  09  0A  0B  0C  0D  0E  0F

A0

B0

C0

D0

E0

F0

      점  접  젓  정  젖  제  젝  젠  젤  젬  젭  젯  젱  져  젼

  졀  졈  졉  졌  졍  졔  조  족  존  졸  졺  좀  좁  좃  종  좆

  좇  좋  좌  좍  좔  좝  좟  좡  좨  좼  좽  죄  죈  죌  죔  죕

  죗  죙  죠  죡  죤  죵  주  죽  준  줄  줅  줆  줌  줍  줏  중

  줘  줬  줴  쥐  쥑  쥔  쥘  쥠  쥡  쥣  쥬  쥰  쥴  쥼  즈  즉

  즌  즐  즘  즙  즛  증  지  직  진  짇  질  짊  짐  집  짓

C2

  00  01  02  03  04  05  06  07  08  09  0A  0B  0C  0D  0E  0F

A0

B0

C0

D0

E0

F0

      징  짖  짙  짚  짜  짝  짠  짢  짤  짧  짬  짭  짯  짰  짱

  째  짹  짼  쨀  쨈  쨉  쨋  쨌  쨍  쨔  쨘  쨩  쩌  쩍  쩐  쩔

  쩜  쩝  쩟  쩠  쩡  쩨  쩽  쪄  쪘  쪼  쪽  쫀  쫄  쫌  쫍  쫏

  쫑  쫓  쫘  쫙  쫠  쫬  쫴  쬈  쬐  쬔  쬘  쬠  쬡  쭁  쭈  쭉

  쭌  쭐  쭘  쭙  쭝  쭤  쭸  쭹  쮜  쮸  쯔  쯤  쯧  쯩  찌  찍

  찐  찔  찜  찝  찡  찢  찧  차  착  찬  찮  찰  참  찹  찻

C3

  00  01  02  03  04  05  06  07  08  09  0A  0B  0C  0D  0E  0F

A0

B0

C0

D0

E0

F0

      찼  창  찾  채  책  챈  챌  챔  챕  챗  챘  챙  챠  챤  챦

  챨  챰  챵  처  척  천  철  첨  첩  첫  첬  청  체  첵  첸  첼

  쳄  쳅  쳇  쳉  쳐  쳔  쳤  쳬  쳰  촁  초  촉  촌  촐  촘  촙

  촛  총  촤  촨  촬  촹  최  쵠  쵤  쵬  쵭  쵯  쵱  쵸  춈  추

  축  춘  출  춤  춥  춧  충  춰  췄  췌  췐  취  췬  췰  췸  췹

  췻  췽  츄  츈  츌  츔  츙  츠  측  츤  츨  츰  츱  츳  층

C4

  00  01  02  03  04  05  06  07  08  09  0A  0B  0C  0D  0E  0F

A0

B0

C0

D0

E0

F0

      치  칙  친  칟  칠  칡  침  칩  칫  칭  카  칵  칸  칼  캄

  캅  캇  캉  캐  캑  캔  캘  캠  캡  캣  캤  캥  캬  캭  컁  커

  컥  컨  컫  컬  컴  컵  컷  컸  컹  케  켁  켄  켈  켐  켑  켓

  켕  켜  켠  켤  켬  켭  켯  켰  켱  켸  코  콕  콘  콜  콤  콥

  콧  콩  콰  콱  콴  콸  쾀  쾅  쾌  쾡  쾨  쾰  쿄  쿠  쿡  쿤

  쿨  쿰  쿱  쿳  쿵  쿼  퀀  퀄  퀑  퀘  퀭  퀴  퀵  퀸  퀼

C5

  00  01  02  03  04  05  06  07  08  09  0A  0B  0C  0D  0E  0F

A0

B0

C0

D0

E0

F0

      큄  큅  큇  큉  큐  큔  큘  큠  크  큭  큰  클  큼  큽  킁

  키  킥  킨  킬  킴  킵  킷  킹  타  탁  탄  탈  탉  탐  탑  탓

  탔  탕  태  택  탠  탤  탬  탭  탯  탰  탱  탸  턍  터  턱  턴

  털  턺  텀  텁  텃  텄  텅  테  텍  텐  텔  템  텝  텟  텡  텨

  텬  텼  톄  톈  토  톡  톤  톨  톰  톱  톳  통  톺  톼  퇀  퇘

  퇴  퇸  툇  툉  툐  투  툭  툰  툴  툼  툽  툿  퉁  퉈  퉜

C6

  00  01  02  03  04  05  06  07  08  09  0A  0B  0C  0D  0E  0F

A0

B0

C0

D0

E0

F0

      퉤  튀  튁  튄  튈  튐  튑  튕  튜  튠  튤  튬  튱  트  특

  튼  튿  틀  틂  틈  틉  틋  틔  틘  틜  틤  틥  티  틱  틴  틸

  팀  팁  팃  팅  파  팍  팎  판  팔  팖  팜  팝  팟  팠  팡  팥

  패  팩  팬  팰  팸  팹  팻  팼  팽  퍄  퍅  퍼  퍽  펀  펄  펌

  펍  펏  펐  펑  페  펙  펜  펠  펨  펩  펫  펭  펴  편  펼  폄

  폅  폈  평  폐  폘  폡  폣  포  폭  폰  폴  폼  폽  폿  퐁

C7

  00  01  02  03  04  05  06  07  08  09  0A  0B  0C  0D  0E  0F

A0

B0

C0

D0

E0

F0

      퐈  퐝  푀  푄  표  푠  푤  푭  푯  푸  푹  푼  푿  풀  풂

  품  풉  풋  풍  풔  풩  퓌  퓐  퓔  퓜  퓟  퓨  퓬  퓰  퓸  퓻

  퓽  프  픈  플  픔  픕  픗  피  픽  핀  필  핌  핍  핏  핑  하

  학  한  할  핥  함  합  핫  항  해  핵  핸  핼  햄  햅  햇  했

  행  햐  향  허  헉  헌  헐  헒  험  헙  헛  헝  헤  헥  헨  헬

  헴  헵  헷  헹  혀  혁  현  혈  혐  협  혓  혔  형  혜  혠

C8

  00  01  02  03  04  05  06  07  08  09  0A  0B  0C  0D  0E  0F

A0

B0

C0

D0

E0

F0

      혤  혭  호  혹  혼  홀  홅  홈  홉  홋  홍  홑  화  확  환

  활  홧  황  홰  홱  홴  횃  횅  회  획  횐  횔  횝  횟  횡  효

  횬  횰  횹  횻  후  훅  훈  훌  훑  훔  훗  훙  훠  훤  훨  훰

  훵  훼  훽  휀  휄  휑  휘  휙  휜  휠  휨  휩  휫  휭  휴  휵

  휸  휼  흄  흇  흉  흐  흑  흔  흖  흗  흘  흙  흠  흡  흣  흥

  흩  희  흰  흴  흼  흽  힁  히  힉  힌  힐  힘  힙  힛  힝

AND

예전에 정리한 바와 같이 python은 C와 연동하기 나름 쉽습니다.

이번에는 마치 pyGtk처럼 다른 큰 library들을 끼고도 잘 되나 실험해봤습니다.

interface와 몸통파일은 다음과 같습니다.

>> cat foo.i
 %module foo
 %{
 extern int foo(void);
 %}
 extern int foo(void);

>> cat foo.c
#include <gtk/gtk.h>
int foo(void) {
    gtk_init(0,0);   
    GtkWidget *window;   
    window = gtk_window_new (GTK_WINDOW_TOPLEVEL);
    gtk_window_set_title (GTK_WINDOW (window), "foo" );
    gtk_widget_show (window);
    gtk_main ();

    return 0;
}


그리고 다음과 같이 연결을 해주면 됩니다.

dsp@dsplinux:~/Projects/swig$ swig -python foo.i
dsp@dsplinux:~/Projects/swig$ gcc -c foo.c foo_wrap.c -I/usr/include/python2.5 `pkg-config --cflags gtk+-2.0`
dsp@dsplinux:~/Projects/swig$ ld -shared foo.o foo_wrap.o -o _foo.so `pkg-config --libs gtk+-2.0`

dsp@dsplinux:~/Projects/swig$ ipython
Python 2.5.2 (r252:60911, Jul 31 2008, 17:28:52)
Type "copyright", "credits" or "license" for more information.

IPython 0.8.1 -- An enhanced Interactive Python.
?       -> Introduction to IPython's features.
%magic  -> Information about IPython's 'magic' % functions.
help    -> Python's own help system.
object? -> Details about 'object'. ?object also works, ?? prints more.

In [1]: import foo

In [2]: foo.foo()

위와 같이 foo.foo()를 실행하면 윈도가 잘 뜨는 것을 확인할 수 있습니다.
정말로 pyGtk처럼 하려면 c++스타일로 붙이면 되겠죠.

AND