У нас есть DLL, которая реализует пользовательский язык программирования. Я хочу добавить поддержку языка Python, оставив тот же код для «API-функции».
Я успешно встроил python в эту DLL, теперь я подхожу к проблеме, чтобы представить всю старую функцию как модуль python.
Теперь эта DLL не отображает функцию API как функцию интерфейса, но она установлена (как указатель на функцию) на языковой движок. Таким образом, невозможно создать новый модуль Python (новую DLL). Но мне нужно сохранить совместимость со старым методом …
Возможно ли создать (и установить) во время выполнения модуль, определенный в той же DLL, где находится Python?
Я думаю, что-то вроде вызова метода PyInit_xxxx после PyInitialize ();
Я решил использовать такой код до Py_Initialize ();
/* Add a built-in module, before Py_Initialize */
PyImport_AppendInittab("xxx", PyInit_xxx);
Самый простой способ сделать это — статически инициализировать ваши статически связанные модули, напрямую вызывая 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.
Это существенно усложнилось в 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 ()
Это намного лучше проверяет ошибки, чем в моем примере выше.