奇怪的进程失败boost.python

2024-09-30 20:21:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我使用boost.python调用脚本。每个python脚本有3个函数:

  • 初始化-必须在开始时调用
  • Uninitialize-必须在完成时调用以关闭每个对象。在
  • 进程-必须在初始化和取消初始化之间多次调用。在

本课程不需要解释:

class PyInit
{
public:
    PyInit() { Py_Initialize(); }
    ~PyInit() {  Py_Finalize();  }
};

此类创建PyInit对象实例,然后初始化所有Python对象,并在构造函数中调用“initialize()”Python函数。 并在析构函数处调用“Uninitialize()”。在

这个类有一个函数“Process”,可以在类外多次调用它。在

^{pr2}$

由于只有“Process”失败,并出现“boost::python::error_already_set”异常,因此将删除PyGuard的当前实例,然后创建新实例。以避免可能作为隐藏异常结果的隐藏依赖项。在

所以,在异常之后,所有python内容都会被删除(甚至调用Py_Finalize()),然后重新创建。在

不过,在4-10个这样的异常之后,整个c++进程都会失败。在

摔倒,甚至避开捕手:

  try
  {
      _PyGuard = make_shared<PyGuard>("my script");
      while(true)
      {
        try {
          _PyGuard->Process();
        }
        catch()
        {
              bool inited = false;
              while(!inited)
              {
                try
                {
                _pyGuard = nullptr;
                _pyGuard = make_shared<PyGuard>("script path.txt");
                inited = true;
                }
                catch(string& e)
                {
                }
              }
        }
      } 
      _PyGuard = nullptr;
  } 
  catch(...)
  {
      //falling, it never being catched here.
  }

所以,我的问题是,为什么它会掉下来而无法被发现?在

我刚发现它落在一条线上:

_pyGuard = make_shared<PyGuard>("script path.txt"); 

调用,所以我觉得是Python引发异常无法捕获。为什么?如何预防呢?在


Tags: 对象实例函数pymakescriptprocesspyinit
1条回答
网友
1楼 · 发布于 2024-09-30 20:21:18

您使用Py_Finalize()可能是问题所在。根据boost1.55文档,您shouldn't use ^{} with Boost.Python。看起来您的程序不需要完成,所以您可以尝试从~PyInit()中删除调用。在

如果由于某种原因确实需要完成,可以查看^{}。在

至于“不可匹配的异常”问题,这通常是同时有两个活动异常的结果。当这种情况发生时,C++将简单地中止。这可能(也可能不是)你的代码发生了什么。在

相关问题 更多 >