python - 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 脚本。当我想重新启动解释器时,我可以完成子解释器并创建一个新的。但我不确定这是否是最好的方法,尤其是考虑到线程。
解决方案
推荐阅读
- java - Mac JAVA 上不显示窗口
- r - 通过每次添加固定值来创建重复的值范围
- typescript - knexjs innerjoin 返回列
- c# - C# - 使用 GroupBy 的 LINQ Lambda 表达式 - 为什么嵌套验证效率如此低下?
- java - Fizz Buzz Cucumber Java
- python - 从两个熊猫数据帧(纬度和经度)映射最近的值
- python - 在 Python 中删除具有一定数量元素的列表
- csv - Netlogo:使用 .csv 作为栅格值的交叉引用
- mongodb - java - 如何根据java中的过滤器标准过滤对象列表?
- django - 在 django 中自动链接两个模型