我正在尝试使用嵌入式python zip文件将python嵌入c / c ++应用程序中。我还想使用站点包,例如numpy。我自己操作sys路径,因此它将包括所有必需的路径。
我现在发现的是:
如果我多次使用Py_Initialize / Py_Finalize,则在使用numpy时,我的应用程序将第二次运行脚本,因为在同一过程中两次导入numpy且Py_Finalize无法清理混乱numpy落后了。
如果我使用子解释器,也会发生同样的情况,因为每次在sup解释器中调用“ import”时,都会再次导入numpy。
如果我使用单个解释器(在应用程序启动时调用Py_Initialize,然后在应用程序关闭时调用Py_Finalize),则只要我不使用站点包,Py_RunFile()就会顺利运行。如果我确实导入了站点软件包(例如import numpy),Py_RunFile将挂起。该应用程序将运行,因为python解释器在其自己的线程中运行,但是解释器本身将挂起。
我知道站点包* .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.
,但是什么也没发生。
那么,有人可以告诉我尝试使用站点包时解释器挂起了什么错吗?
编辑:
除了用于操纵sys.path
和Py_Initialize
的那些函数外,我不调用其他任何python特定的函数
编辑2:
我找到了this discussion。
但是那个家伙有一个问题,如果他使用子解释器,程序会挂起。但是对我来说使用子解释器只能工作一次,然后崩溃(如上所述)。不过,似乎同一行将导致死锁:
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