Я пытаюсь встроить python в приложение c / c ++, используя встроенный zip-файл python. Я также хочу использовать site-пакеты, например numpy. Я сам манипулирую путем sys, поэтому он будет включать все необходимые пути.
На данный момент я обнаружил:
Если я использую Py_Initialize / Py_Finalize более одного раза, мое приложение завершится сбоем во второй раз, когда я запускаю скрипт при использовании numpy, из-за того, что numpy импортируется дважды во время одного и того же процесса, а Py_Finalize не убирает беспорядок Numpy оставляет позади.
Если я использую субинтерпретаторы, то же самое происходит, потому что, опять же, numpy импортируется каждый раз, когда в интерпретаторе sup вызывается «import».
Если я использую один интерпретатор (вызывая 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