扩展中的致命错误:PyThreadState_Get:没有当前线程

Fatal error in extension: PyThreadState_Get: no current thread

本文关键字:线程 前线 Get 致命错误 PyThreadState 扩展      更新时间:2023-10-16

我看过几篇说同样错误的帖子,但查看和尝试这些帖子中的答案并没有帮助。我想知道是否有人可以看看这个,看看是否有东西弹出?

我正在为 CPP 应用程序构建 Python 扩展,并且在编译和构建步骤中没有错误。但是,当我导入模块时,我收到标题中提到的错误。其他 stackoverflow 答案声称这是因为在编译和使用不同的解释器时与一个库链接。据我所知,我使用相同的Python解释器。我现在要描述为什么我认为我在链接过程和解释器中使用相同的 Python。

这是我用来构建 Python 扩展的 comand

$ gcc -shared helicsPYTHON_wrap.c $(python-config3 --includes) -I/path/to/helics-0.9/includes -L/path/to/helics-0.9/lib -lhelicsSharedLib -L$(python3-config --prefix)/lib -lpython3.6m -o _helics.so
$ which python3-config
/Users/$USER/miniconda3/bin/python3-config
$ python3-config --prefix
/Users/$USER/miniconda3

如果我尝试导入导入共享库的 python 文件,它会引发致命错误。如果我在共享库上使用otool -L,我会得到以下内容。这就是我期望得到的。

$ otool -L _helics.so
_helics.so:
@rpath/libhelicsSharedLib.dylib (compatibility version 0.0.0, current version 0.0.0)
@rpath/libpython3.6m.dylib (compatibility version 3.6.0, current version 3.6.0)
/usr/local/opt/zeromq/lib/libzmq.5.dylib (compatibility version 7.0.0, current version 7.3.0)
libboost_program_options.dylib (compatibility version 0.0.0, current version 0.0.0)
libboost_filesystem.dylib (compatibility version 0.0.0, current version 0.0.0)
libboost_system.dylib (compatibility version 0.0.0, current version 0.0.0)
libboost_date_time.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/local/opt/gcc/lib/gcc/7/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.24.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.60.2)
/usr/local/lib/gcc/7/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)

我还尝试install_name_tool添加libpython3.6m.dylib的完整路径。

$ install_name_tool -change @rpath/libpython3.6m.dylib /Users/$USER/miniconda3/envs/py3/lib/libpython3.6m.dylib _helics.so

我仍然得到同样的致命错误。我的假设是我的Mac System Python 2.7安装在某些阶段对此过程产生了影响。不过我无法确定在哪里。

有没有办法添加更多调试语句来找出为什么会出现致命的 Python 错误。目前,错误消息非常短。

$ python helics.py
Fatal Python error: PyThreadState_Get: no current thread
[1]    64481 abort      python helics.py

奇怪的是,如果我使用 conda 环境并使用 Python 2.7,我能够很好地加载扩展!这就是为什么我认为当我使用 Python 3.6 时,它会以某种方式从默认的 mac 系统 python 2.7 安装中获取一些东西并且工作正常。当我使用 conda 2.7 python 环境时,它正在拾取同样的东西,但是因为它们都是 Python 2.7(尽管 conda 是 2.7.14,系统 python 是 2.7.10),它似乎可以工作。这是我使用 conda 环境时otool -L输出。

$ otool -L _helics.so
_helics.so:
@rpath/libhelicsSharedLib.dylib (compatibility version 0.0.0, current version 0.0.0)
@rpath/libpython2.7.dylib (compatibility version 2.7.0, current version 2.7.0)
/usr/local/opt/zeromq/lib/libzmq.5.dylib (compatibility version 7.0.0, current version 7.3.0)
libboost_program_options.dylib (compatibility version 0.0.0, current version 0.0.0)
libboost_filesystem.dylib (compatibility version 0.0.0, current version 0.0.0)
libboost_system.dylib (compatibility version 0.0.0, current version 0.0.0)
libboost_date_time.dylib (compatibility version 0.0.0, current version 0.0.0)
/usr/local/opt/gcc/lib/gcc/7/libstdc++.6.dylib (compatibility version 7.0.0, current version 7.24.0)
/usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1238.60.2)
/usr/local/lib/gcc/7/libgcc_s.1.dylib (compatibility version 1.0.0, current version 1.0.0)

我的问题是 1) 如何从 Python 的错误中获取更多调试信息。我已经尝试过python -vvv,但这并没有给我足够的信息。我尝试使用 gdb,但这也没有给我任何信息。我相信它需要使用调试符号重新编译 Python 本身。2)您对如何解决此问题或进一步调试有什么建议吗?

另外,我不确定这是否是有用的信息,但我能够在创建共享库后使用 ctypes 并加载共享库。我只是无法将其导入为 python 模块。

如果有兴趣,这是原始问题 - https://github.com/GMLC-TDC/HELICS-src/issues/59

编辑:我使用zsh和bash尝试了这个,但仍然得到同样的错误。我还尝试在 shell 中临时设置以下export PATH="/Users/$USER/miniconda3/bin:/Users/$USER/miniconda3/lib"并运行,但仍然收到相同的错误。这应该排除了我的Mac系统Python 2.7.10,所以我真的不确定发生了什么。

再次编辑:我也尝试过用Python2重新安装miniconda。如果我使用 Python2,一切正常。我只是无法使用miniconda使用Python3。奇怪的是,如果我使用自制软件并安装Python3,那似乎可以正常工作。

再次编辑:这可能是High Sierra的问题。我目前无法访问另一台 Mac,但我使用的是具有 SIP 的最新操作系统。我不确定这是否导致了这个问题。此外,我尝试使用Anaconda3但没有运气。

再次编辑:这似乎与操作系统无关。我能够在另一台具有High Sierra的计算机上成功运行它。

再次编辑:我在其他新的操作系统安装上对此进行了测试,但它们不起作用。但它们确实在我的两台机器上工作。是否有其他工具可以告诉您库需要什么依赖项或 Python 在哪里抛出致命错误?我目前最好的猜测是,我过去曾在其他机器上安装过一些东西,可以做到这一点。我需要确定那是什么,并确保我可以记录下来。

再次编辑:我添加了我正在使用的 Python 版本的输出要点。

再次编辑:我添加了miniconda和anaconda的标签,因为我在使用自制python3时没有遇到此问题,但仅在我将miniconda3或anaconda2与python3环境中一起使用时才遇到此问题。这似乎总是适用于Python2,无论是自制的,anaconda还是miniconda。

再次编辑:

如果其他人想要在其计算机上复制,则这些步骤。

git clone https://github.com/GMLC-TDC/HELICS-src
mkdir build-osx
brew install boost
brew install cmake
brew install swig
cmake -DBUILD_PYTHON=ON -DPYTHON_LIBRARY=$(python3-config --prefix)/lib/libpython3.6m.dylib -DPYTHON_INCLUDE_DIR=$(python3-config --prefix)/include/python3.6m/ ..
make
cd ./swig/python/
python helics.py # Error

我能够通过更改CMakeLists.txt以使用此答案中的建议使用-undefined dynamic_lookup来解决此问题。 例如,CMakeList.txt在这里。我在不同的机器上得到不同结果的原因是因为我的一个Mac有Python 3.6.1,而其他的有Python>=3.6.2

你有Python 3.6,来自自制软件...而你的模块,在构建引用了 Python 2.7,由系统提供。这是描述的相同问题。从其中一个评论 -python3.6-config --ldflags将显示要在Makefile中使用的LDFLAGS

确保活动的 python 框架的 lib 目录位于链接器搜索路径中。希望这会起作用..