在运行时创建Python3模块,同时初始化嵌入式Python

2024-09-28 22:22:38 发布

您现在位置:Python中文网/ 问答频道 /正文

我们有一个实现自定义编程语言的DLL。我想做的是添加对python语言的支持,使“API函数”的代码保持不变。在

我成功地将python嵌入到这个DLL中,现在我要解决的问题是将所有旧函数公开为python模块。在

现在这个DLL不公开API函数作为接口函数,但是它被安装(作为函数指针)到语言引擎。这样就不可能创建一个新的python模块(一个新的DLL)。但我需要保持与旧方法的兼容性。。。在

是否可以在同一个运行库中定义并安装在同一个模块中?在

我认为类似于在PyInitialize()之后调用pyinitial_xxxx方法


Tags: 模块方法函数代码引擎api语言定义
3条回答

在Py_Initialize()之前,我已经用这样的代码解决了这个问题

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

处理此问题最简单的方法是在调用Py_initialize()或PyMac_initialize()之后直接调用initspam()来静态初始化静态链接的模块:

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();

在Python源代码发行版的Demo/embed/Demo.c文件中可以找到一个示例。在

这在Python3中变得更加复杂(与Python2相比),但我已经让它在我的代码中工作,所以我希望这对您也有用。在

// 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()

这比我上面的例子有更好的错误检查。在

相关问题 更多 >