Python C API и данные, хранящиеся в памяти? - PullRequest
2 голосов
/ 13 января 2010

Я рассматриваю возможность интеграции некоторого кода C в систему Python (Django), и я рассматривал возможность использования API Python / C. Альтернатива - два отдельных процесса с IPC, но я сначала смотрю на прямое взаимодействие. Я новичок в Python, поэтому я пытаюсь понять, какое направление выбрать.

Возможно ли вызвать функцию инициализатора C для malloc блока памяти (и поместить в него что-то) и вернуть ему дескриптор обратно в скрипт Python (указатель на начало блока памяти) , Выделенная память должна оставаться в куче после возврата из функции init. Затем скрипт Python может вызывать последующие функции C (передавая в качестве аргумента указатель на начало памяти), и функция может немного подумать и вернуть значение скрипту Python. Наконец, есть еще одна функция C для освобождения памяти.

Предположим, что приложение является однопоточным и что после функции init память считывается только из, поэтому параллелизм не является проблемой. Объем памяти составит несколько сотен мегабайт.

  • Это вообще возможно? Позволит ли мне Python malloc из кучи и оставит ли он там? Придет ли это из памяти процесса Python? Будет ли Python пытаться выяснить это (т. Е. Выполняет ли он свое собственное выделение памяти и не ожидает ли другие процессы вмешательства в его адресное пространство)?
  • Могу ли я просто вернуть байтовый массив в виде управляемой строки Python (или аналогичного типа данных) и передать ссылку обратно в качестве аргумента вызова C? Будет ли Python в порядке с такой большой строкой?
  • Было бы лучше сделать это с отдельным процессом и IPC?

Ответы [ 2 ]

2 голосов
/ 13 января 2010
1 голос
/ 13 января 2010

Вы, безусловно, можете использовать C API, чтобы делать то, что вы хотите. Вы создадите класс в C, который может хранить любую память, какую захочет. Эта память вообще не должна быть открыта для Python, если вы не хотите.

Если вам удобно создавать библиотеки DLL на языке C и вам не нужно выполнять операции на языке Python на языке C, то вам лучше всего подойдет ctypes.

...