【问题标题】:Fatal Python error: Can't initialize threads for interpreter when calling python from c致命的 Python 错误:从 c 调用 python 时无法为解释器初始化线程
【发布时间】:2019-01-13 16:19:47
【问题描述】:

我尝试从c调用python代码,示例代码在我的环境(python3.6)上运行正常,但是当我将它集成到我的程序中时,当我调用Py_Initialize();时出现以下错误:

...
sem_init: Success
Fatal Python error: Can't initialize threads for interpreter

你能提供一些线索来解决这个问题吗?

似乎错误来自here,但我仍然不确定如何避免这种情况。

【问题讨论】:

  • 你试过调试它吗?你找到了错误发生的地方。现在您需要检查此时程序的状态,看看哪个值是错误的,然后跟踪它的起源。
  • 我试过gdb,但是没有python的源文件,出现Py_Initialize () at Python/pylifecycle.c:480 480 Python/pylifecycle.c: No such file or directory. (gdb) n等错误
  • 这时需要获取对应的来源。它们通常以“源包”形式出现(这取决于您的发行版)。参见例如askubuntu.com/questions/28372/…
  • 看来我需要额外的权限才能执行此操作,谢谢。

标签: python c locking cpython


【解决方案1】:

失败的代码是

    if (head_mutex == NULL)
        Py_FatalError("Can't initialize threads for interpreter");

在代码中搜索 head_mutex 引用 finds

#define HEAD_INIT() (void)(head_mutex || (head_mutex = PyThread_allocate_lock()))

在失败代码之前调用。

所以,原因是PyThread_allocate_lock 返回NULL。根据操作系统和构建标志,在 Python 代码库中有几种不同的实现,因此您需要对其进行调试,或者找出在您的情况下使用哪一个来进一步跟踪操作系统调用的错误。

【讨论】:

  • 我认为this function用于我的环境,我试图弄清楚如何在这里查看dprintf的日志,似乎dprintf需要两个参数,但只有一个参数在这里,我真的很好奇。
  • @wangzhe 这意味着sem_init 失败但errno 在某种程度上是0
  • 我不知道这是怎么发生的。您需要对此进行调试。
【解决方案2】:

我的程序中有一个名为sem_init的函数,可能与系统库冲突,我修改这个函数的名称后程序运行正常(但仍然不确定原因)。

【讨论】:

  • C 没有命名空间,所以如果你有一个与库函数同名的函数,它可以很容易地覆盖它:任何想要调用库函数的代码都会调用你的,从而导致不希望的结果。实际上,您可能已经收到(并且很高兴地忽略了)关于此的编译器警告。
猜你喜欢
  • 2020-03-18
  • 1970-01-01
  • 1970-01-01
  • 2021-06-20
  • 2011-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多