微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Python 应用程序因“PyEval_RestoreThread:必须在持有 GIL 的情况下调用该函数,但已释放 GIL”而崩溃

如何解决Python 应用程序因“PyEval_RestoreThread:必须在持有 GIL 的情况下调用该函数,但已释放 GIL”而崩溃

我有一个 Python 程序,因为它太大了,这里是它的源代码链接Link

当我在 Mac 上运行它时,有时会出现这个奇怪的异常:

Fatal Python error: PyEval_RestoreThread: the function must be called with the GIL held,but the GIL is released (the current Python thread state is NULL)
Python runtime state: initialized

Current thread 0x0000000115f8ce00 (most recent call first):
  File "/usr/local/Cellar/python@3.9/3.9.2_1/Frameworks/Python.framework/Versions/3.9/lib/python3.9/tkinter/__init__.py",line 1429 in mainloop
  File ".../PyPlusSource/pyplus.py",line 1435 in <module>

那么为什么会发生这种情况呢?请用简单的话解释一下。感谢您的任何想法!

编辑:
我在 MacOS 11.2.3 Big Sur [非测试版] 上,安装了 Python 3.9.2 [不再是测试版]。而且这个错误很难重现

解决方法

一般来说,这应该只发生在将 Python 与其他语言(通常是 C;参见,例如 When the GIL is released?)的组件相结合的代码中。

根据您的描述,不清楚您的代码的哪一部分导致了错误(11 天前提出的原始问题说它是 line 1435,您 6 天前添加的视频显示它是 line 1452,并且您引用的 GitHub 上的 PyPlus 代码在 2 天前已更改,目前只有 1441 行),因此,您需要检查自己代码中产生错误的确切位置。

错误进一步指向 tkinter/__init__.py 中的第 1429 行(据我在 Python 3.9 版本的 tkinter 中看到)在以下函数中为 if string:

def _getints(self,string):
    """Internal function."""
    if string:
        return tuple(map(self.tk.getint,self.tk.splitlist(string)))

因此,该函数似乎是使用未定义的变量 string 调用的。

由于各种原因,我多次收到此 PyEval_RestoreThread 错误:

  • 当来自 cythonized Python 模块(Mac 上的 .so)的函数调用来自另一个间接导入的模块的函数时。例如,如果模块 a.py 导入 b.pyb.py 导入 c.py,并且 a.py 中的函数使用来自 c.py 的函数。当从 PyCharm 或终端通过 python3 myprogram.py 运行时,没有错误,但是一旦模块被 cythonized,a.so 中的函数就再也找不到来自 c.so 的函数,我得到了这个错误。

  • 在辅助线程中未捕获的异常;例如,当我没有检查从文件中读取的变量的类型并尝试使用非字符串值更新我的(PySimpleGUI = tkinter-based)GUI 中的字符串时。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?