Python/SWIG2010/06/07 17:22

리눅스에서 Python과 C를 연동하는 방법에 관한 내용은 많이 찾을 수 있었는데, 윈도우에서 하는 방법에 대한 자료가
별로 없어 따라하기 형식으로 간단하게 정리해보았습니다..

내용을 보시기 전에 자신의 컴퓨터에 Cygwin과 Gcc가 준비되어 있지 않은 경우 [여기]를 참고해서 먼저 설치하시기
바랍니다.


설치를 하셨으면 다음과 같은 간단한 C 코드를 작성해서 sample.c 라는 이름으로 적당한 디렉토리에 저장합니다.

/* sample.c */

int echo(int p)
{
    return p;
}

int add(int x, int y)
{
    return x + y; }


그리고 Cygwin을 열어서 sample.c 파일이 있는 디렉토리로 이동합니다. 
여기에서는 D:\PrjRoot\python_lec 디렉토리에 sample.c 파일이 있다고 가정하고 진행합니다.



다음은 sample.c 코드를 Python에서 이용하기 위한 정보 파일인 Swig 인터페이스, sample.i 파일을 만듭니다.

/* sample.i */

%module sample

%{
extern int echo(int);
extern int add(int, int);
%}

extern int echo(int);
extern int add(int, int);


그리고 Swig를 이용해 Wrapper 파일을 생성합니다.



자, 다음은 sample.c 파일과 sample_wrap.c 파일에 대한 object 파일을 만들 차례입니다.

여기에서 옵션 -I (대문자 아이) 에는 Python 설치 디렉토리 하위의 include 디렉토리 경로를 적어주면 됩니다.


그럼 이제 object 파일로 공유 라이브러리를 만들어 Python에서 사용할 수 있도록 해보죠.

옵션 -L (대문자 엘) 에는 Python 설치 디렉토리 경로를, -l (소문자 엘) 에는 Python 설치 디렉토리에 있는 ythonXX.dll,
Python 2.6을 설치한 경우에는 python26.dll, 의 파일명(pythonXX)을 적어주면 됩니다.


마지막으로 test.c 에 있는 함수들을 사용할 수 있는지 파이썬 코드를 만들어 테스트해 봅니다.

# test.py

import sample

print sample.echo(5)
print sample.add(2, 5)

위와 같은 결과가 나온다면 Python과 C 연동이 제대로 된겁니다.


참고로 제가 테스트한 환경은 다음과 같습니다.

- Windows XP Professional SP3 한글
- Python 2.6
- SWIG 1.3.36 윈도우용
- Cygwin 2.573.2.3


[기타]
1. Cygwin에 Gcc 설치하기
2. 리눅스에서 Python과 C 연동하기

C, 씨, gcc, Python, Python C 연동, swig, 스위그, 파이썬, 파이썬 연동
Posted by 야노
This and That2009/02/08 18:46




"하청에 재하청...다단계하도급구조 속에 숨어버린 책임소재.
책임지지 않는 이들의 명령에 용산의 철거민들은 쓰러져갔고
IT노동자들은 오늘도 코피를 쏟으며 밤을 샌다."

한줄 답변 또는 아래의 링크에 의견을 남겨주시기 바랍니다.

http://it.nodong.net/zbxe/?mid=FREEBRD01&document_srl=193255&listStyle=&cpage=
Posted by 야노
Javascript/Tech&Tip2009/02/05 19:10


/*
 * objIdNoFront : 주민등록번호 앞자리 개체
 * objIdNoRear  : 주민등록번호 뒷자리 개체
 */
function isIdNoCorrect(objIdNoFront, objIdNoRear) {
    var chk = 0;
    var yy = objIdNoFront.value.substring(0,2);
    var mm = objIdNoFront.value.substring(2,4);
    var dd = objIdNoFront.value.substring(4,6);
    var sex = objIdNoRear.value.substring(0,1);

    if (objIdNoRear.value.split(" ").join("") == "") {
        alert("주민등록번호를 입력하세요.");
        objIdNoFront.focus();
        return false;
    }
   
    if (objIdNoFront.value.length != 6) {
        alert("주민등록번호 앞자리를 입력하세요.");
        objIdNoFront.focus();
        return false;
    }
   
    if (objIdNoRear.value.length != 7 ) {
        alert("주민등록번호 뒷자리를 입력하세요.");
        objIdNoRear.focus();
        return false;
    }
   
    if (isNaN(objIdNoFront.value) || isNaN(objIdNoRear.value)) {
        objIdNoFront.value = "";
        objIdNoRear.value = "";
        alert("주민등록번호는 숫자만 가능합니다.");
        return false;
    }
   
    if ((objIdNoFront.value.length != 6) || (mm < 1 || mm > 12 || dd < 1)) {
        alert ("주민등록번호 앞자리가 올바르지 않습니다.");
        objIdNoFront.focus();
        return false;
    }
   
    if ((sex != 1 && sex != 2 ) || (objIdNoRear.value.length != 7 )) {
        alert ("주민등록번호 뒷자리가 올바르지 않습니다.");
        objIdNoRear.focus();
        return false;
    }

    for (var i = 0; i <= 5 ; i++) {
        chk = chk + ((i % 8 + 2) * parseInt(objIdNoFront.value.substring(i, i+1)));
    }
   
    for (var i = 6; i <=11 ; i++) {
        chk = chk + ((i % 8 + 2) * parseInt(objIdNoRear.value.substring(i-6, i-5)));
    }

    chk = 11 - (chk % 11);
    chk = chk % 10;

    if (chk != objIdNoRear.value.substring(6, 7)) {
        alert ("올바르지 않은 주민등록번호입니다.");
        objIdNoFront.focus();
        return false;
    }
   
    return true;
}

저작자 표시 비영리 변경 금지
Posted by 야노
Javascript/Tech&Tip2009/01/21 12:00

function checkBrowserType() {
    var bIE = new RegExp(/MSIE/).test(navigator.userAgent);           // MS Internet Explorer
    var bNS = new RegExp(/Netscape/).test(navigator.userAgent);   // Mozilla Netscape
    var bFF = new RegExp(/Firefox/).test(navigator.userAgent);        // Mozilla Firefox

    if (bIE) {                    // bIE가 참이면
      alert("마이크로소프트 인터넷 익스플로러");
    } else if (bNS) {         // bNS가 참이면
      alert("모질라 넷스케이프");
    } else if (bFF) {          // bFF가 참이면
      alert("모질라 파이어폭스");
    } else {
      alert("기타 브라우저");
    }
}


저작자 표시 비영리 변경 금지
Posted by 야노
Html/Tech&Tip2009/01/21 11:26

#000000 #000031 #000063 #00009C #0000CE #0000FF
#003100 #003131 #003163 #00319C #0031CE #0031FF
#310000 #310031 #310063 #31009C #3100CE #3100FF
#313100 #313131 #313163 #31319C #3131CE #3131FF
#006300 #006331 #006363 #006391 #0063CE #0063FF
#316300 #316331 #316363 #31639C #3163CE #3163FF
#009C00 #009C31 #009C63 #009C9C #009CCE #009CFF
#319C00 #319C31 #319C63 #319C9C #319CCE #319CFF
#00CE00 #00CE31 #00CE63 #00CE9C #00CECE #00CEFF
#31CE00 #31CE31 #31CE63 #31CE9C #31CECE #31CEFF
#00FF00 #00FF31 #00FF63 #00FF9C #00FFCE #00FFFF
#31FF00 #31FF31 #31FF63 #31FF9C #31FFCE #31FFFF
#639C00 #639C31 #639C63 #639C9C #639CCE #639CFF
#63CE00 #63CE31 #63CE63 #63CE9C #63CECE #63CEFF
#9CCE00 #9CCE31 #9CCE63 #9CCE9C #9CCECE #9CCEFF
#9CFF00 #9CFF31 #9CFF63 #9CFF9C #9CFFCE #9CFFFF
#63FF00 #63FF31 #63FF63 #63FF9C #63FFCE #63FFFF
#CEFF00 #CEFF31 #CEFF63 #CEFF9C #CEFFCE #CEFFFF
#630000 #630031 #630063 #63009C #6300CE #6300FF
#633100 #633131 #633163 #63319C #6331CE #6331FF
#636300 #636331 #636363 #63639C #6363CE #6363FF
#9C9C00 #9C9C31 #9C9C63 #9C9C9C #9C9CCE #9C9CFF
#CECE00 #CECE31 #CECE63 #CECE9C #CECECE #CECEFF
#9C0000 #9C0031 #9C0063 #9C009C #9C00CE #9C00FF
#9C3100 #9C3131 #9C3163 #9C319C #9C31CE #9C31FF
#9C6300 #9C6331 #9C6363 #9C639C #9C63CE #9C63FF
#CE6300 #CE6331 #CE6363 #CE639C #CE63CE #CE63FF
#CE9C00 #CE9C31 #CE9C63 #CE9C9C #CE9CCE #CE9CFF
#CE0000 #CE0031 #CE0063 #CE009c #CE00CE #CE00FF
#CE3100 #CE3131 #CE3163 #CE319C #CE31CE #CE31FF
#FF0000 #FF0031 #FF0063 #FF009C #FF00CE #FF00FF
#FF3100 #FF3131 #FF3163 #FF319C #FF31CE #FF31FF
#FF6300 #FF6331 #FF6363 #FF639C #FF63CE #FF63FF
#FF9C00 #FF9C31 #FF9C63 #FF9C9C #FF9CCE #FF9CFF
#FFCE00 #FFCE31 #FFCE63 #FFCE9C #FFCECE #FFCEFF
#FFFF00 #FFFF31 #FFFF63 #FFFF9C #FFFFCE #FFFFFF




 

 

저작자 표시 비영리 변경 금지
Posted by 야노