【发布时间】:2018-06-15 19:48:05
【问题描述】:
我已经看到了几篇声明相同错误的帖子,但查看并尝试这些帖子中的答案并没有帮助。我想知道是否有人可以看看这个,看看是否有什么东西弹出?
我正在为 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 的标签,因为我在使用 homebrew python3 时没有遇到这个问题,但只有在我使用 miniconda3 或 anaconda2 和 python3 环境时才遇到这个问题。无论是自制软件、anaconda 还是 miniconda,这似乎总是适用于 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
【问题讨论】:
-
在 Windows 上使用 MSYS2 编译线程化 Python 扩展时,我奇怪地遇到了同样的问题。不确定它是否相关,但无论如何我都想知道答案。
-
你解决了吗?
-
那么
python -V和python3 -V返回什么? -
我添加了一个要点,显示您描述的命令和其他一些命令的输出。
-
可以在ubuntu中重现吗?
标签: python c++ python-3.x macos anaconda