Создайте модуль Python3 во время выполнения при инициализации встроенного Python

У нас есть DLL, которая реализует пользовательский язык программирования. Я хочу добавить поддержку языка Python, оставив тот же код для «API-функции».

Я успешно встроил python в эту DLL, теперь я подхожу к проблеме, чтобы представить всю старую функцию как модуль python.

Теперь эта DLL не отображает функцию API как функцию интерфейса, но она установлена ​​(как указатель на функцию) на языковой движок. Таким образом, невозможно создать новый модуль Python (новую DLL). Но мне нужно сохранить совместимость со старым методом …

Возможно ли создать (и установить) во время выполнения модуль, определенный в той же DLL, где находится Python?

Я думаю, что-то вроде вызова метода PyInit_xxxx после PyInitialize ();

1

Решение

Я решил использовать такой код до Py_Initialize ();

/* Add a built-in module, before Py_Initialize */
PyImport_AppendInittab("xxx", PyInit_xxx);
1

Другие решения

Самый простой способ сделать это — статически инициализировать ваши статически связанные модули, напрямую вызывая initspam () после вызова Py_Initialize () или PyMac_Initialize ():

int main(int argc, char **argv)
{
/* Pass argv[0] to the Python interpreter */
Py_SetProgramName(argv[0]);

/* Initialize the Python interpreter.  Required. */
Py_Initialize();

/* Add a static module */
initspam();

Пример можно найти в файле Demo / embed / demo.c в дистрибутиве исходного кода Python.

1

Это существенно усложнилось в Python 3 (по сравнению с тем, как это было в Python 2), но я заставил его работать на мой код, поэтому я надеюсь, что это сработает и для вас.

// Python 3's init function must return the module's PyObject* made
// with PyModule_Create()
PyObject* initspam();
const char* spam_module_name;

int main(int argc, char **argv)
{
Py_Initialize();

PyImport_AddModule(spam_module_name);
PyObject* module = initspam();

PyObject* sys_modules = PyImport_GetModuleDict();
PyDict_SetItemString(sys_modules, spam_module_name, module);
Py_DECREF(module)

...
}

Я нашел пример этого в исходном коде Python 3:

Python-3.4.2 \ Python \ pythonrun.c: import_init ()

Это намного лучше проверяет ошибки, чем в моем примере выше.

1
По вопросам рекламы [email protected]