首页 > 解决方案 > Python C API错误重新启动解释器

问题描述

我正在开发一个小 DLL 作为 C++ 应用程序和 Python 脚本之间的代理。我想公开一个重新启动python解释器的函数。我尝试过这样的事情:

    void initialize()
    {
        Py_Initialize();
    }

    void finalize()
    {
        Py_Finalize();
    }

我可以初始化解释器并完成它,但是当我想再次启动它时,我收到以下错误:

C:\A\31\s\Objects\structseq.c:398: bad argument to internal function

我检测到在 Python 代码中导入第三方模块(如 numpy、pandas、tensorflow 等)时会发生这种情况。我认为这是由于完成后释放内存时出现的一些问题,但不确定。文档说:

Bug 和注意事项:模块和模块中对象的销毁是按随机顺序进行的;这可能会导致析构函数(del () 方法)在依赖于其他对象(甚至函数)或模块时失败。由 Python 加载的动态加载的扩展模块不会被卸载。Python解释器分配的少量内存可能无法释放(如果发现泄漏,请报告)。对象之间的循环引用中占用的内存不会被释放。扩展模块分配的一些内存可能不会被释放。如果多次调用它们的初始化例程,某些扩展可能无法正常工作;如果应用程序多次调用 Py_Initialize() 和 Py_FinalizeEx() ,就会发生这种情况。

我想创建一个子解释器并用它来运行我的 python 脚本。当我想重新启动解释器时,我可以完成子解释器并创建一个新的。但我不确定这是否是最好的方法,尤其是考虑到线程。

标签: pythoncpython-3.xapipython-c-api

解决方案


推荐阅读