gpt4 book ai didi

python - 扩展中的 fatal error : PyThreadState_Get: no current thread

转载 作者:IT老高 更新时间:2023-10-28 22:30:38 24 4
gpt4 key购买 nike

我已经看到几个帖子都说明了同样的错误,但是在这些帖子中寻找和尝试答案并没有帮助。我想知道是否有人可以看看这个,看看是否有什么东西弹出?

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

这是我用来构建 Python 扩展的命令

$ 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)它似乎工作。这是 otool -L使用 conda 环境时的输出。
$ 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 进行了尝试,但仍然出现相同的错误。我也尝试设置以下 export PATH="/Users/$USER/miniconda3/bin:/Users/$USER/miniconda3/lib"暂时在 shell 中运行,我仍然遇到相同的错误。这应该排除我的 Mac 系统 Python 2.7.10,所以我真的不确定发生了什么。

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

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

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

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

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

再次编辑:我已经添加了 miniconda 和 anaconda 的标签,因为我在使用自制软件 python3 时没有遇到这个问题,但仅当我在 python3 环境中使用 miniconda3 或 anaconda2 时才遇到这个问题。这似乎总是适用于 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正如 this answer 中所建议的.例如。 CMakeLists.txt 是 here .我在不同机器上得到不同结果的原因是因为我的一台 mac 有 Python 3.6.1 但其他的有 Python>=3.6.2

关于python - 扩展中的 fatal error : PyThreadState_Get: no current thread,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48123074/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com