1

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

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

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

是否可以在运行时创建(并安装)在 Python 所在的同一个 DLL 中定义的模块?

我想在 PyInitialize(); 之后调用 PyInit_xxxx 方法。

4

3 回答 3

2

这在 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()

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

于 2015-02-05T16:32:10.137 回答
1

处理这个问题的最简单方法是在调用 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 中可以找到一个示例。

于 2014-12-06T23:45:32.583 回答
1

我在Py_Initialize();之前使用这样的代码解决了问题。

/* Add a built-in module, before Py_Initialize */
PyImport_AppendInittab("xxx", PyInit_xxx);
于 2013-08-22T12:57:55.490 回答