【问题标题】:Embedding python and running for multiple times嵌入python并多次运行
【发布时间】:2021-08-18 01:43:36
【问题描述】:

我正在使用 boost::python 嵌入 python,我就是这样做的:

void runCode(){
    Py_Initialize();
    //boost::python code goes here and embedded python code runs
    Py_Finalize();
}

第一次运行良好,但再次运行时出现此错误:

LookupError:未知编码:utf8

代码没有按预期运行,感谢任何帮助。

【问题讨论】:

  • 对此的补充说明:从boost documentation,您目前不应该致电Py_Finalize()。他们不支持它。
  • @sharth 你是对的,我在不使用 Py_Finalize 的情况下调用它,但这不是一个理想的解决方案

标签: c++ python boost-python


【解决方案1】:

由于您没有得到专家的答案,我提供了我从解决类似问题中的经验。 Python 与reinitialization support 存在问题。如果您由于某些错误需要重新启动解释器,或者想要运行许多独立的解释器,这很不幸。

一个问题是资源和内存泄漏(引用上面的链接):

错误和警告:动态加载的扩展模块由 Python 没有被卸载。分配的少量内存 Python 解释器可能无法释放(如果发现泄漏,请报告 它)。对象之间的循环引用占用的内存不是 释放。扩展模块分配的一些内存可能不会被释放。 如果它们的初始化例程,某些扩展可能无法正常工作 被多次调用;如果应用程序调用,这可能会发生 Py_Initialize() 和 Py_Finalize() 不止一次。

另一个问题是许多模块不能正确支持这一点,例如in this SO thread我认为这是您面临的问题。

似乎大多数 Python 应用程序都解决了这个问题:

  • 通过让引擎在专用进程中运行;
  • 使用subinterpreters 代表不同的执行状态(通用解释器)

如果第二个对你有用,请继续。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-10
    • 1970-01-01
    • 2012-06-24
    • 2022-01-05
    相关资源
    最近更新 更多