2013-08-07 16 views
1

我们实现一个自定义的编程语言中的DLL。我想要做的就是添加对Python语言的支持,保留“API函数”相同的代码。在运行时创建一个Python3模块,同时初始化一个嵌入式Python

我已经succefully在此DLL中嵌入的蟒蛇,现在我快到问题揭露所有的老功能的Python模块。

现在这个DLL不公开的API功能接口的功能,但它的安装(如函数指针)的语言引擎。这样就不可能创建一个新的python模块(一个新的DLL)。但我需要继续用旧方法兼容...

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

我认为像调用PyInitialize后PyInit_xxxx方法();

回答

1

我使用这样代码解决之前 Py_Initialize();

/* Add a built-in module, before Py_Initialize */ 
PyImport_AppendInittab("xxx", PyInit_xxx); 
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文件中找到。

+0

欢迎来到Stack Overflow!很高兴看到第一篇文章是一个答案,保持它:) – Kelm

+1

该演示是为Python 2 ... Python 3更复杂。 – teeks99

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

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