Python C 연동

#################################################
# 파이썬에서 사용할 C 모듈 구현
# python_c_test.cpp
#################################################
/*
title : 파이썬 C 연동 테스트
author : ysoftman
desc : 파이썬 C Api 를 사용하여 파이쎤 <-> C 간 함수 호출
python version : 3.5
reference :
https://docs.python.org/3/c-api/index.html
https://docs.python.org/3/extending/index.html#extending-index

[윈도우 경우]
프로젝트 설정 -> c/c++ -> 추가 포함 디렉토리 -> c:\Python35\include  추가
프로젝트 설정 -> linker -> 추가 라이브러리 디렉토리 -> C:\Python35\libs 추가
c:\Python35\python35.dll -> 프로젝트 경로 복사
*/

// Python.h 에 stdio.h stdlib.h string.h 등 기본적인 헤더 파일이 포함되어 있음
#include <Python.h>

static PyObject *MyError;

static PyObject *execute_system_command(PyObject *self, PyObject *args)
{
const char *command;
int sts;

if (!PyArg_ParseTuple(args, "s", &command))
return NULL;
printf("%s\n", command);

sts = system(command);
if (sts < 0) {
PyErr_SetString(MyError, "System command failed");
return NULL;
}

return PyLong_FromLong(sts);
}

// 메소드 테이블 설정
static PyMethodDef MyMethods[] = {

// 파이썬에서 systcmd 를 호출하면 실제 execute_system_command 가 실행되도록 함
{"syscmd",  execute_system_command, METH_VARARGS, "Execute a shell command."},
{NULL, NULL, 0, NULL}        /* Sentinel */
};

// 모듈 구조 설정
static struct PyModuleDef MyModule = {
PyModuleDef_HEAD_INIT,
"MyModule", /* name of module */
NULL, /* module documentation, may be NULL */
-1, /* size of per-interpreter state of the module, or -1 if the module keeps state in global variables. */
MyMethods
};


// 모듈 초기화 함수
// 파이썬에서 import 시 맨 처음 호출된다.
// 초기화 함수는 PyInit_이름() 형식으로 만들어야 한다
PyMODINIT_FUNC PyInit_MyModule(void)
{
return PyModule_Create(&MyModule);
}

int main(int argc, char *argv[])
{
printf("%s testing...\n", argv[0]);

wchar_t *program = Py_DecodeLocale(argv[0], NULL);
if (program == NULL) {
fprintf(stderr, "Fatal error: cannot decode argv[0]\n");
exit(1);
}
/* Add a built-in module, before Py_Initialize */
PyImport_AppendInittab("MyModule", PyInit_MyModule);

/* Pass argv[0] to the Python interpreter */
Py_SetProgramName(program);

/* Initialize the Python interpreter.  Required. */
Py_Initialize();

PyMem_RawFree(program);

//Py_Finalize();

return 0;
}


#################################################
# 파이썬 distutils 용 모듈 설정
# setup_c_module.py
#################################################
from distutils.core import setup, Extension

module1 = Extension('MyModule',
                    sources = ['python_c_test.cpp'])

setup (name = 'MyPackage',
       version = '1.0',
       description = 'This is a test package',
       ext_modules = [module1])


#################################################
# 모듈 설치하기
#################################################
sudo python3 setup_c_module.py install


#################################################
# 파이썬에서 C 모듈 사용하기
# python_c_test.py
#################################################
import MyModule
MyModule.syscmd("ls -ahl")

comments:

댓글 쓰기