встроенный питон зависает при импорте сайта-пакета - PullRequest
0 голосов
/ 27 июня 2019

Я пытаюсь встроить python в приложение c / c ++, используя встроенный zip-файл python. Я также хочу использовать site-пакеты, например numpy. Я сам манипулирую путем sys, поэтому он будет включать все необходимые пути.

На данный момент я обнаружил:

  1. Если я использую Py_Initialize / Py_Finalize более одного раза, мое приложение завершится сбоем во второй раз, когда я запускаю скрипт при использовании numpy, из-за того, что numpy импортируется дважды во время одного и того же процесса, а Py_Finalize не убирает беспорядок Numpy оставляет позади.

  2. Если я использую субинтерпретаторы, то же самое происходит, потому что, опять же, numpy импортируется каждый раз, когда в интерпретаторе sup вызывается «import».

  3. Если я использую один интерпретатор (вызывая Py_Initialize при запуске приложения и затем вызывая Py_Finalize при закрытии приложения), Py_RunFile () будет работать без перебоев, пока я не использую site-пакеты. Если я импортирую пакет сайта (например, import numpy), Py_RunFile будет зависать. Приложение будет работать, потому что интерпретатор python работает в своем собственном потоке, но сам интерпретатор зависнет.

Я знаю, что файлы site-package * .pyd загружаются:

'xxx.exe' (Win32): Loaded 'C:\tools\python37x64\DLLs\_ctypes.pyd'. Symbols loaded.
'xxx.exe' (Win32): Loaded 'C:\tools\python37x64\Lib\site-packages\numpy\.libs\libopenblas.TXA6YQSD3GCQQC22GEQ54J2UDCXDXHWN.gfortran-win_amd64.dll'. Module was built without symbols.
'xxx.exe' (Win32): Loaded 'C:\tools\python37x64\Lib\site-packages\numpy\core\_multiarray_umath.cp37-win_amd64.pyd'. Module was built without symbols.
'xxx.exe' (Win32): Loaded 'C:\tools\python37x64\Lib\site-packages\numpy\core\_multiarray_tests.cp37-win_amd64.pyd'. Module was built without symbols.
'xxx.exe' (Win32): Loaded 'C:\tools\python37x64\Lib\site-packages\numpy\linalg\lapack_lite.cp37-win_amd64.pyd'. Module was built without symbols.
'xxx.exe' (Win32): Loaded 'C:\tools\python37x64\Lib\site-packages\numpy\linalg\_umath_linalg.cp37-win_amd64.pyd'. Module was built without symbols.
'xxx.exe' (Win32): Loaded 'C:\tools\python37x64\DLLs\_bz2.pyd'. Symbols loaded.
'xxx.exe' (Win32): Loaded 'C:\tools\python37x64\DLLs\_lzma.pyd'. Symbols loaded.
'xxx.exe' (Win32): Loaded 'C:\tools\python37x64\DLLs\_decimal.pyd'. Symbols loaded.
'xxx.exe' (Win32): Loaded 'C:\tools\python37x64\Lib\site-packages\numpy\fft\fftpack_lite.cp37-win_amd64.pyd'. Module was built without symbols.
'xxx.exe' (Win32): Loaded 'C:\tools\python37x64\Lib\site-packages\numpy\random\mtrand.cp37-win_amd64.pyd'. Module was built without symbols.

но тогда ничего не происходит.

Так, кто-нибудь может сказать мне, что я делаю неправильно, что мой интерпретатор зависает, когда я пытаюсь использовать пакеты сайта?

редактирование:

Я не вызываю никаких других специфичных для Python функций, кроме тех, которые манипулируют sys.path и Py_Initialize

изменить 2:

Я нашел это обсуждение .

Но у этого парня была проблема с тем, что программа зависла, если бы он использовал вспомогательные переводчики. Но использование вспомогательных интерпретаторов для меня работает один раз, а затем происходит сбой (как упомянуто выше). Тем не менее, похоже, что здесь та же самая строка ведет к тупику:

python37.dll!_PyCOND_WAIT_MS(_PyCOND_T * cv, _RTL_CRITICAL_SECTION * cs, unsigned long ms) Line 187 C
python37.dll!take_gil(_ts * tstate) Line 208    C
python37.dll!PyEval_RestoreThread(_ts * tstate) Line 273    C
python37.dll!PyGILState_Ensure() Line 1067  C
_multiarray_umath.cp37-win_amd64.pyd!00007ffdab6ee940() Unknown
...