Импортируйте и используйте стандартный модуль Python из расширения Python C - PullRequest
5 голосов
/ 11 февраля 2012

У меня есть модуль расширения Python, написанный на C. Я хочу использовать в этом коде C один из стандартных модулей Python, например, os или shutil. Как лучше это сделать?

Ответы [ 2 ]

8 голосов
/ 11 февраля 2012
PyObject* os = PyImport_ImportModuleNoBlock("os");
if (os == NULL)
  return NULL;
someattr = PyObject_GetAttrString(os, "someattr");
Py_DECREF(os);

Если вы импортируете модуль только один раз, например, в функции init_yourmodule(), используйте PyImport_ImportModule("os").

2 голосов
/ 11 февраля 2012

Не.

Вместо этого измените модуль расширения так, чтобы он предоставлял службу Python, а затем напишите код Python, который вызывает os, shutil и ваш модуль.

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

Конечно, вы можете вызывать модули Python из кода C , это просто слишком много для низкоуровневых модулей, таких как os и shutil. Когда дело доходит до методов копирования файлов в shutil, их переопределение в вашем коде на C тривиально. На самом деле, в Windows копирование файла выполняется с помощью обращения к ОС, поэтому кода на C не так много даже для записи.

Если модуль Python написан на C, вы можете просто скопировать код для нужных вам методов.

...