Неустранимая ошибка в расширении: PyThreadState_Get: нет текущей нити

Я видел несколько сообщений, которые заявили ту же ошибку, но поиск и тестирование ответов в этих сообщениях не помогли. Мне было интересно, может ли кто-нибудь посмотреть на это и посмотреть, что-нибудь выскочит?

Я создаю расширение Python для приложения CPP, и на этапе компиляции и сборки ошибок нет. Однако, когда я импортирую модуль, я получаю ошибку, упомянутую в заголовке. Другие ответы 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 влияет на этот процесс на определенном этапе. Я не могу определить, где.

Есть ли способ добавить дополнительные отладочные инструкции, чтобы узнать, почему существует ошибка Fatal 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, он каким-то образом собирает что-то из установки python 2.7 по умолчанию и работает отлично. Он выбирает ту же самую вещь, когда я использую среду python для среды conda 2.7, но поскольку они оба 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" временно в оболочке и запустить, и я STILL получаю ту же ошибку. Это должно было исключить мой Mac System Python 2.7.10, поэтому я действительно не уверен, что происходит.

Изменить снова: я также попытался переустановить миниконду с помощью Python2. И если я использую Python2, все работает нормально. Я просто не могу использовать Python3, используя miniconda. Как ни странно, если я использую homebrew и устанавливаю Python3, который, кажется, работает нормально.

Изменить снова: Возможно, это проблема с High Sierra. В настоящее время у меня нет доступа к другому Mac, но я нахожусь в последней операционной системе с SIP. Я не уверен, что это вызывает эту проблему. Кроме того, я пытался использовать Anaconda3 и не повезло.

Изменить снова: это, похоже, не связано с операционной системой. Я могу успешно запустить это на другом компьютере с High Sierra.

Изменить снова: я тестировал это на других свежих установках ОС, и они не работают. Но они работают на двух моих машинах. Существуют ли другие инструменты, которые расскажут вам, какую зависимость требуется библиотеке или где Python создает фатальную ошибку? Мое лучшее предположение на данный момент заключается в том, что в прошлом я установил что-то на своих других машинах, что позволяет этому работать. Мне нужно определить, что это было, и убедиться, что я могу его документировать.

Изменить еще раз: я добавил gist выходной версии Python, которую я использую.

Изменить еще раз: я добавил теги для miniconda и anaconda, так как я не испытываю этой проблемы при использовании homebrew 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

Ответы

Ответ 1

Мне удалось решить эту проблему, изменив CMakeLists.txt на использование -undefined dynamic_lookup, как это предложено в этом ответе. Например. CMakeLists.txt здесь. И причина, по которой я получал разные результаты на разных машинах, заключалась в том, что у одного из моих маков был Python 3.6.1, а у остальных был Python >= 3.6.2

Ответ 2

У вас есть Python 3.6, от homebrew... В то время как ваш модуль, создавая ссылку на Python 2.7, предоставляется системой. Здесь описана одна и та же проблема. Из одного из комментариев - python3.6-config --ldflags будет отображаться LDFLAGS, который будет использоваться в вашем файле Makefile.

Ответ 3

Убедитесь, что активный каталог python framework lib находится в пути поиска компоновщика. Надеюсь, что это сработает.