Список постов в категории "Программирование"

Создание модуля расширения для Python на языке Си

Простой, а главное — рабочий пример модуля расширения на языке C для питона. Модуль называется example, а реализовывает одну функцию hello, которая вызывается с параметром who и возвращает «Hello %s» % who.

Листинг модуля example.c

Python 2.xx

#include <Python.h>

PyObject *hello( PyObject *self, PyObject *args, PyObject *kwargs )
{
    char *who = 0;
    static char *keywords[] = {"who", NULL};
    PyObject *result = 0;

    if (!PyArg_ParseTupleAndKeywords(args, kwargs, "s", keywords, &who))
    {
        return NULL;
    }

    result = PyString_FromString("Hello ");
    PyString_Concat(&result, PyString_FromString(who));
    return result;
}


static PyMethodDef example_methods[] = 
{
    { "hello", (PyCFunction) hello, METH_KEYWORDS, "hello(who) -- return "Hello who"" },
    { NULL, 0, 0, NULL }
};


PyMODINIT_FUNC initexample()
{
    (void) Py_InitModule("example", example_methods);

    if (PyErr_Occurred())
    {
        PyErr_SetString(PyExc_ImportError, "example module init failed");
    }
}

Python 3.xx

#include <Python.h>
 
PyObject *hello( PyObject *self, PyObject *args, PyObject *kwargs )
{
    char *who = 0;
    static char *keywords[] = {"who", NULL};

    if (PyArg_ParseTupleAndKeywords(args, kwargs, "s", keywords, &who))
    {
        return PyUnicode_FromFormat("Hello %s", who);
    }
    return NULL;
}
 

static PyMethodDef example_methods[] = 
{
    { "hello", (PyCFunction) hello, METH_KEYWORDS, "hello(who) -- return "Hello who"" },
    { NULL, 0, 0, NULL }
};


static struct PyModuleDef example_module = 
{
    PyModuleDef_HEAD_INIT,
    "example",
    NULL,
    -1,
    example_methods
};
 

PyMODINIT_FUNC PyInit_example(void)
{
    return PyModule_Create(&example_module);
}

Листинг setup.py

setup.py

from distutils.core import setup
from distutils.extension import Extension
examplemodule = Extension(name="example", sources=['example.c', ])
setup(name="example", ext_modules=[examplemodule])

Компилируем:

python setup.py build

Инсталлируем:

python setup.py install

Выполняем простенький тест:

from example import hello
print hello(who="world!")

Радуемся :)

Hello world!

Полезные ссылки (на английском):

Цикл статей про Boost.Python на хабре:

P.S. По своему опыту могу сказать, что Boost.Python — редкостное барахло, возьмите лучше библиотеку PyCXX.

Утилита для создания текстурных атласов

Представляю на суд общественности утилиту для создания текстурных атласов из набора изображений.

Утилита написана на питоне мной и моим коллегой, работает исправно до сих пор.

Использование тривиально:

Usage: atlastool.py [options] directory

Options:
  --version             show program's version number and exit
  -h, --help            show this help message and exit
  -v, --verbose         verbose output

  Atlas options:
    -W MAXWIDTH, --max-width=MAXWIDTH
                        max atlas width [default 2048]
    -H MAXHEIGHT, --max-height=MAXHEIGHT
                        max atlas height [default 2048]
    -p PADDING, --padding=PADDING
                        atlas image padding [default 1]
    -s SORTON, --sort-on=SORTON
                        sort parameter (width or height) [default "height"]
    --skip-dimension-sum=SKIPDIMENSIONSUM
                        skip images with dimension sum greater then [default
                        4294967296]
    -a ALPHATHRESHOLD, --alpha-threshold=ALPHATHRESHOLD
                        alpha threshold for image trimming [default 1]
    --no-optimize       disable atlas size optimization

  Output options:
    -f FORMAT, --format=FORMAT
                        output format (ogre, cocos2d, cocos2d-with-path)
    -o OUTPUTDIRECTORY, --output=OUTPUTDIRECTORY
                        output directory [default "./atlases"]
    -n OUTPUTNAME, --output-name=OUTPUTNAME
                        output filename [default "atlas"]

На данный момент поддерживает только png, но при желании можно добавить любой известный формат.

Личный блог Евгения Жирнова