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

时间:2018-01-06 00:22:37

标签: python c++ python-3.x macos anaconda

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

我正在为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)它似乎工作。当我使用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 System Python 2.7.10,所以我真的不确定发生了什么。

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

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

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

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

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

再次编辑:我已经为miniconda和anaconda添加了标签,因为我在使用自制的python3时没有遇到过这个问题,但只是在我使用miniconda3或anaconda2和python3环境时。无论是自制软件,无论是自制软件还是小型软件,它总是可以与Python2一起使用。

再次编辑:

如果其他人想要在他们的机器上复制,这些步骤就是这些步骤。

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

我能够按this answer中的建议更改CMakeLists.txt以使用-undefined dynamic_lookup来解决此问题。例如。 CMakeLists.txt是here。我在不同机器上得到不同结果的原因是因为我的一个mac有Python 3.6.1但其他人有Python> = 3.6.2

答案 2 :(得分:0)

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