Передача строки из C в Python для многопроцессорной обработки без создания дополнительной копии - PullRequest
1 голос
/ 29 марта 2012

У меня есть приложение C, в которое встроен интерпретатор Python 2.7. В какой-то момент в моей программе генерируется потенциально большая строка (char*), которая должна быть обработана некоторым кодом Python. Я использую PyObject_CallFunction для вызова функции Python и передачи строки в качестве аргумента. Затем эта функция Python использует библиотеку multiprocessing для анализа данных в отдельном процессе.

Передача строки в функцию Python создаст копию данных в объекте Python str. Я попытался избежать этой дополнительной копии, передав объект buffer в функцию Python. К сожалению, это приводит к ошибке в процессе multiprocessing во время расслоения:

TypeError: buffer() takes at least 1 argument (0 given)

Кажется, что buffer объекты могут быть засолены, но не засолены.

Есть предложения по передаче char* из C в функцию multiprocessing без создания дополнительной копии?

1 Ответ

1 голос
/ 14 апреля 2012

Подход, который работал для меня:

Прежде чем создавать большую строку C, выделите для нее память с помощью Python:

PyObject *pystr = PyString_FromStringAndSize(NULL, size);
char *str = PyString_AS_STRING(pystr);
/* now fill <str> with <size> bytes */

Таким образом, когда приходит время передать его Python, вам не нужно создавать копию:

PyObject *result = PyObject_CallFunctionObjArgs(callable, pystr, NULL);
/* or PyObject_CallFunction(callable, "O", pystr) if you prefer */

Обратите внимание, что вы не должны изменять строку, как только это будет сделано.

...