예전에 정리한 바와 같이 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++스타일로 붙이면 되겠죠.

2008/10/27 17:09 2008/10/27 17:09

Translate to English

번역 api에 대한 설명은 이 포스트를 참조하세요...

트랙백 주소 :: http://cybershin.x-y.net/tt/trackback/253

댓글을 달아 주세요

요즘 회사용 linux PC(ubuntu 8.04 hardy)에 Screenlets(http://www.screenlets.org/index.php/Home)를 깔아 쓰고 있습니다. 그 중에 보면 Slideshow가 있는데요. Slideshow의 기능 중에 Flickr의 공개된 일부 그림들을 볼 수가 있는데요. 이게 URL이 정해져 있어서 좀 답답합니다. 그래서 이걸 좀 다른 Flickr도 쓸 수 있게 바꿔보았습니다.


[Screenlets 화면]

/usr/share/screenlets/Slideshow/SlideshowScreenlet.py를 다음과 같이 수정하면 됩니다. 혹시 python-BeautifulSoup이나 python-image-library가 안 깔려 있다면 설치해야 합니다. 아래 와 같이 수정하면 Flickr로 설정을 변경할 경우, 전지현+김태희 그림이 나오도록 세팅되어있구요. 이걸 바꾸거나 추가하고 싶으면, 파일 제일 앞부분의 FLICKR_URLS = [ ... ] 에 url string을 추가하면 됩니다.

우선 파일 앞부분에 다음을 추가합니다.

FLICKR_URLS = [
    'http://www.flickr.com/search/?s=int&q=%EC%A0%84%EC%A7%80%ED%98%84&m=text',
    'http://www.flickr.com/search/?s=int&q=%EA%B9%80%ED%83%9C%ED%9D%AC&m=text'
]
from BeautifulSoup import BeautifulSoup
import re


그리고 파일 중간 부분의 fetch_image 함수를 다음과 같이 수정합니다. 즉, fetch_image 함수에서 if self.engine1=='Flickr': 부분부터 imageget = urlopen(realimage) 앞까지 쭈욱 갖다 붙이시면 됩니다. 아, 물론 이 사이에 있던 기존 코드는 살짝 주석처리해 주셔야됩니다.

def fetch_image(self):

    ...

     if self.engine1 == 'Flickr':
        #appended by dsp.shin
        source = urlopen( random.choice( FLICKR_URLS) )
        sourcetxt = source.read()

        sources = []
        reals = []
        rPhoto = re.compile('/photos(.*?)')
        soup = BeautifulSoup( sourcetxt )
        hrefs = soup('a', {'href':rPhoto})
        for href in hrefs:
            imgs = href('img', {'class':'pc_img'})
            if len(imgs)>0:
                sources.append( href.get('href') )
                reals.append( imgs[0].get('src') )
        if len(sources)>0:
            index = random.randint(0, len(sources)-1)
            sourceimage = str(sources[index])
            realimage = str(reals[index])
            imageurl = 'http://www.flickr.com' + sourceimage
            self.url = imageurl
        else:
            #not working
            realimage = 'http://creativeclass.typepad.com/thecreativityexchange/images/2007/09/19/menatwork.png'
            self.url = realimage
        #end -- dsp.shin


        imageget = urlopen(realimage)
        ...


ps. 현재는 flickr 검색페이지 결과만 파싱 가능함.
ps2. 괜찮은 연예인 flickr url(or 검색어) 찾으면 댓글로 좀 알려주세요~

2008/08/05 17:06 2008/08/05 17:06

Translate to English

번역 api에 대한 설명은 이 포스트를 참조하세요...

트랙백 주소 :: http://cybershin.x-y.net/tt/trackback/232

댓글을 달아 주세요

주기적으로 mysql db를 백업할 일이 생기는데,
백업 후에 replication을 다시 설정하려면 이쪽저쪽 서버에 접속을 해야합니다.

그러한 이유로 python 상에서 ssh 접속을 어떻게 하나 찾아봤더니,
paramiko라는게 있더군요.

#SSH 접속하기. - by using paramiko
import paramiko
client = paramiko.SSHClient()
client.load_system_host_keys()
client.connect(HOST, username=USER, password=PASSWORD)
stdin, stdout, stderr = client.exec_command('ls -l')
print stdout.read()
client.close()

위의 스크립트를 이용해서 ssh에 접속하고 나머지는 다음의 순서로 해결할 수 있겠습니다.
물론 이건 incremental하게 backup & sync하는건 아니고 통짜로 무쉭하게 할 경우에 대한 이야기입니다.

1. get master-status
2. dump
3. rsync
4. ssh open
4.1 drop db
4.2 import
4.3 slave setup & start
4.4 ssh close

1번에서 master-status를 가져오는건 commands.getoutput()을 이용하면 됩니다.
즉, "Master에 기존 데이터가 있는 상태에서 replication 하기"의 내용을 스크립트로 실행시키는거죠.

2008/04/22 22:41 2008/04/22 22:41

Translate to English

번역 api에 대한 설명은 이 포스트를 참조하세요...

트랙백 주소 :: http://cybershin.x-y.net/tt/trackback/196

댓글을 달아 주세요

MetaWebLogAPI를 사용하면 블로그에 접속하지 않고서도 포스팅을 할 수 있습니다.
python에서는 다음과 같이 간단한 함수 하나만 짜면 되죠.
물론 getPost, editPost도 가능하지만 가장 사용빈도가 높은 newPost만 예로 들겠습니다.

아래의 예는 tistory의 경우입니다.
(물론 환경설정에 가서 blogapi를 활성화 시켜 놓아야 합니다)

다른 블로그 서비스들의 경우도 크게 다르지 않습니다.

def Post( title, description, tags ):
    import xmlrpclib
    tistory=xmlrpclib.Server("http://somewhere.tistory.com/api")
    post={'category': '',
        'title': title,
        'description': description,
        'mt_keywords': tags }
    no=tistory.metaWeblog.newPost("blog ID", "user ID","password", post, True)
    print "posted :",no

       
보다 자세히 xmlrpc에 대해 알고 싶으시다면,
아래 링크에 가서 mark pilgrim님의 글을 읽어보세요.
http://www.xml.com/pub/a/2003/10/15/dive.html
2008/04/04 00:26 2008/04/04 00:26

Translate to English

번역 api에 대한 설명은 이 포스트를 참조하세요...

트랙백 주소 :: http://cybershin.x-y.net/tt/trackback/190

댓글을 달아 주세요

  1. Dsp 2008/04/05 12:44  댓글주소  수정/삭제  댓글쓰기

    트랙백 쏘기를 위한 라이브러리도 있군요~

    http://www.postneo.com/projects/tblib/

ubuntu에서 설치는 synaptic을 이용해서 간단하게 설치가능하니 생략하고...
mod_python을 설치한 후에 enable 시키려면,
/etc/apache2/mods-enabled 폴더에 symbolic link 를 다음과 같이 건다.

mod_python.load -> ../mods-available/mod_python.load

또한 httpd.conf , 혹은 다른 conf file에 다음과 같이 python handler를 지정한다.

<Directory "/python코드의패쓰">
AddHandler python-program .py
PythonHandler test
PythonDebug on
</Directory>

다음과 같이 지정된 경로에 test.py 파일을 생성한다.

from mod_python import apache

def handler(req):
  req.content_type="Text/Plain"
  req.send_http_header()
  req.write("This is a test page...")
  return apache.OK

그리고 apache를 재시작한 후,

sudo /etc/init.d/apache2 restart

이제, 사이트에 접속해 보면 된다.

http://localhost/python/test.py


혹시 php, perl에는 익숙하고 python은 잘 모른다면,
아래 사이트가 유용할 것이다.

http://qna.nu/w/cs/?python=on&php=on&perl=on
2008/04/02 13:00 2008/04/02 13:00

Translate to English

번역 api에 대한 설명은 이 포스트를 참조하세요...

트랙백 주소 :: http://cybershin.x-y.net/tt/trackback/188

댓글을 달아 주세요

python을 쓰다보면 C와 연동할 일이 생기는데,
이럴 때 사용하게 되는 것이 swig입니다.
http://www.swig.org/

다음은 초간단한 c 함수를 만들어서 swig를 이용하여,
python에서 호출을 해 보도록 하겠습니다.
( 이 내용들은 swig tutorial에 있는 내용들을 좀 더 간단하게
제 환경에서 테스트해본 결과입니다. )

~/temp$ vi sample.c
int inc( int a ){
        return a+1;
}

~/temp$ vi sample.i
%module sample
%{
extern int inc(int a);
%}
extern int inc(int a);

~/temp$ swig -python sample.i
~/temp$ gcc -c sample.c sample_wrap.c -I/usr/include/python2.4
~/temp$ ld -shared sample.o sample_wrap.o -o _sample.so

~/temp$ ipython
Python 2.4.3 (#2, Oct  6 2006, 07:52:30)
Type "copyright", "credits" or "license" for more information.

IPython 0.7.1.fix1 -- 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 sample
In [2]: sample.inc(1)
Out[2]: 2

ㅇㅋ!

2008/04/01 18:53 2008/04/01 18:53

Translate to English

번역 api에 대한 설명은 이 포스트를 참조하세요...

트랙백 주소 :: http://cybershin.x-y.net/tt/trackback/187

댓글을 달아 주세요

  1. dalmasian 2008/04/02 08:56  댓글주소  수정/삭제  댓글쓰기

    python에서 C를 호출할 수 있군요~ ^__^
    그러면~ C++를 호출 하려면? 갈켜 주삼

  2. dsp 2008/09/11 16:19  댓글주소  수정/삭제  댓글쓰기

    2.5부터 탑재된 Ctypes
    http://ko.wikipedia.org/wiki/Ctypes

구글 코드 대학

개발 2008/03/24 19:04
구글 코드 대학이랍니다.
http://code.google.com/edu/

다음과 같은 내용이 들어있습니다.
특히 요며칠 python 책을 머사볼까 했는데,
일단 python 강의를 듣고 고민해봐야할듯 :)

ps.
봐야할것들은 넘쳐흐르는데 시간이 모자르는군요... ㅡ.ㅜ

ps2.
중국어,일어는 지원되는데 한국어는 지원안되는군요...
역시 변방의 설움...
CJK~에서 K가 젤 마지막이고 시원찮을때 알아봤어야되었나...

2008/03/24 19:04 2008/03/24 19:04

Translate to English

번역 api에 대한 설명은 이 포스트를 참조하세요...

트랙백 주소 :: http://cybershin.x-y.net/tt/trackback/180

댓글을 달아 주세요

  1. dalmasian 2008/03/25 14:58  댓글주소  수정/삭제  댓글쓰기

    오호~ 유용한 정보~ 저도 가서 어떤 내용들이 있는 지 살펴 봐야 겠군요

Encoding Detector ( python )
http://chardet.feedparser.org/
Mark Pilgrim님의 chardet입니다.
웹문서들을 보다보면 인코딩이 뭔지 몰라 당황스러울때가 가끔 있는데요.
그럴때 쓰면 가뭄의 비가 따로 없죠~ :)
( 저보다 파이썬레벨이 942배쯤 높은 류책임님의 추천으로 알게된 사이트)

CSS 테이블 겔러리
http://icant.co.uk/csstablegallery/index.php?css=2
가끔 테이블 꾸밀 필요가 있을 때 갖다 쓰고 있습니다...

Webpage Tempate들
http://www.free-css-templates.com/
저처럼 디자인센스가 없는 사람들에겐 필수적인 사이트죠...
울나라처럼 그림 더덕더덕붙은 풍은 아니지만... 전 이런 페이지가 더 좋네요~
2008/03/13 11:08 2008/03/13 11:08

Translate to English

번역 api에 대한 설명은 이 포스트를 참조하세요...

트랙백 주소 :: http://cybershin.x-y.net/tt/trackback/176

댓글을 달아 주세요

pymssql을 MySQLdb로 이전할 때,
인터페이스 상으로는 DB API 2.0을 둘다 지원하니 크게 바꿀 부분이 없을 것 같네요.

connect 함수의 입력인자 password, database 가 passwd, db 로만 바꿔주면 될 듯...

ex.
conn = MySQLdb.connect(
   host = '아무데나',
   user = '아무나',
   passwd = '****',
   db = 'dbname'
)
cs = conn.cursor()
cs.execute(sql)
res = cs.fetchall()
...

그 외에 문제가 넘처 흐르겠지만,
추후에 정리할 날이 온다면 정리할랍니다 :)
2008/02/07 00:11 2008/02/07 00:11

Translate to English

번역 api에 대한 설명은 이 포스트를 참조하세요...

트랙백 주소 :: http://cybershin.x-y.net/tt/trackback/154

댓글을 달아 주세요