Python Language
확장 기능 작성
수색…
C 확장을 사용한 Hello World
다음 C 소스 파일 (데모 용으로 hello.c
라고 부름)은 hello
라는 단일 함수 greet()
을 포함하는 확장 모듈을 생성합니다.
#include <Python.h>
#include <stdio.h>
#if PY_MAJOR_VERSION >= 3
#define IS_PY3K
#endif
static PyObject *hello_greet(PyObject *self, PyObject *args)
{
const char *input;
if (!PyArg_ParseTuple(args, "s", &input)) {
return NULL;
}
printf("%s", input);
Py_RETURN_NONE;
}
static PyMethodDef HelloMethods[] = {
{ "greet", hello_greet, METH_VARARGS, "Greet the user" },
{ NULL, NULL, 0, NULL }
};
#ifdef IS_PY3K
static struct PyModuleDef hellomodule = {
PyModuleDef_HEAD_INIT, "hello", NULL, -1, HelloMethods
};
PyMODINIT_FUNC PyInit_hello(void)
{
return PyModule_Create(&hellomodule);
}
#else
PyMODINIT_FUNC inithello(void)
{
(void) Py_InitModule("hello", HelloMethods);
}
#endif
gcc
컴파일러로 파일을 컴파일하려면, 좋아하는 터미널에서 다음 명령을 실행하십시오 :
gcc /path/to/your/file/hello.c -o /path/to/your/file/hello
앞서 작성한 greet()
함수를 실행하려면 동일한 디렉토리에 파일을 작성하고 hello.py
import hello # imports the compiled library
hello.greet("Hello!") # runs the greet() function with "Hello!" as an argument
C 확장에 열린 파일 전달
파이썬에서 열려있는 파일 객체를 C 확장 코드로 전달하십시오.
PyObject_AsFileDescriptor
함수를 사용하여 파일을 정수 파일 기술자로 변환 할 수 있습니다 :
PyObject *fobj;
int fd = PyObject_AsFileDescriptor(fobj);
if (fd < 0){
return NULL;
}
정수 파일 기술자를 다시 파이썬 객체로 변환하려면 PyFile_FromFd
사용 PyFile_FromFd
.
int fd; /* Existing file descriptor */
PyObject *fobj = PyFile_FromFd(fd, "filename","r",-1,NULL,NULL,NULL,1);
C ++ 및 부스트를 사용한 C 확장
이것은 C ++ 및 Boost를 사용하는 C 확장 의 기본 예제입니다.
C ++ 코드
hello.cpp에 넣은 C ++ 코드 :
#include <boost/python/module.hpp>
#include <boost/python/list.hpp>
#include <boost/python/class.hpp>
#include <boost/python/def.hpp>
// Return a hello world string.
std::string get_hello_function()
{
return "Hello world!";
}
// hello class that can return a list of count hello world strings.
class hello_class
{
public:
// Taking the greeting message in the constructor.
hello_class(std::string message) : _message(message) {}
// Returns the message count times in a python list.
boost::python::list as_list(int count)
{
boost::python::list res;
for (int i = 0; i < count; ++i) {
res.append(_message);
}
return res;
}
private:
std::string _message;
};
// Defining a python module naming it to "hello".
BOOST_PYTHON_MODULE(hello)
{
// Here you declare what functions and classes that should be exposed on the module.
// The get_hello_function exposed to python as a function.
boost::python::def("get_hello", get_hello_function);
// The hello_class exposed to python as a class.
boost::python::class_<hello_class>("Hello", boost::python::init<std::string>())
.def("as_list", &hello_class::as_list)
;
}
이것을 파이썬 모듈로 컴파일하려면 파이썬 헤더와 부스트 라이브러리가 필요합니다. 이 예제는 우분투 12.04에서 python 3.4와 gcc를 사용하여 만들어졌습니다. Boost는 많은 플랫폼에서 지원됩니다. 우분투의 경우 필요한 패키지는 다음을 사용하여 설치되었습니다 :
sudo apt-get install gcc libboost-dev libpython3.4-dev
소스 파일을 나중에 파이썬 경로에있는 모듈로 가져올 수있는 .so 파일로 컴파일 :
gcc -shared -o hello.so -fPIC -I/usr/include/python3.4 hello.cpp -lboost_python-py34 -lboost_system -l:libpython3.4m.so
example.py 파일의 파이썬 코드 :
import hello
print(hello.get_hello())
h = hello.Hello("World hello!")
print(h.as_list(3))
그러면 python3 example.py
는 다음과 같은 결과를 출력합니다 :
Hello world!
['World hello!', 'World hello!', 'World hello!']
Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow