python — фатальная ошибка в расширении: 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, он каким-то образом берет что-то из стандартной установки Mac OS 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" временно в оболочке и работает, и я все равно получаю ту же ошибку. Это должно было исключить мой Mac System Python 2.7.10, так что я действительно не уверен, что происходит.

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

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

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

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

Изменить еще раз: я добавил суть вывода версии 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

14

Решение

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

2

Другие решения

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

2

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

0
По вопросам рекламы ammmcru@yandex.ru
Adblock
detector