简体   繁体   中英

loading bokeh into embedded python dll crashes

python (3.7.3) is embedded into a an executable via the C-API. When a Python Script is loaded with function PyImport_Import() and the script contains a bokeh import, ie from bokeh.plotting import figure the loading process ends prematurely with a floating point exception.

The executable is written in Delphi, but its python API is almost identical to the original C-API. I've loaded many other modules without any problems. bokeh is the first one that cannot be loaded.

The calling Delphi program, with the python dll already loaded into the exe process

  // module name as PPyObject
  pPyName := delpy.PyString_FromString(PAnsiChar(AnsiString(module)));
  // import module
  pPyModule := delpy.PyImport_Import(pPyName);

and the python script

import ptvsd
import pandas as pd
from bokeh.plotting import figure

def main_fnc():
    ptvsd.enable_attach(address=('localhost', 5678), redirect_output=True)
    ptvsd.wait_for_attach()
    breakpoint()
    print('Hello World!')

The following event log lists the dlls loaded into the process, showing only the last entries which - judged by their naming - are related to graphics functions. And finally the thrown error.

Loading Module: spline.cp37-win32.pyd. Without Debug-Infos. Base address: $2BD70000. Process XYZ.exe (8512)
Loading Module: _nd_image.cp37-win32.pyd. Without Debug-Infos. Base address: $2BDD0000. Process XYZ.exe (8512)
Loading Module: _ni_label.cp37-win32.pyd. Without Debug-Infos. Base address: $2BE00000. Process XYZ.exe (8512)
Loading Module: _spectral.cp37-win32.pyd. Without Debug-Infos. Base address: $2BE90000. Process XYZ.exe (8512)
Loading Module: _peak_finding_utils.cp37-win32.pyd. Without Debug-Infos. Base address: $2BEB0000. Process XYZ.exe (8512)
Loading Module: _hamilton_filter.cp37-win32.pyd. Without Debug-Infos. Base address: $2BFB0000. Process XYZ.exe (8512)
Loading Module: _kim_smoother.cp37-win32.pyd. Without Debug-Infos. Base address: $2BFF0000. Process XYZ.exe (8512)
Loading Module: linbin.cp37-win32.pyd. Without Debug-Infos. Base address: $2C030000. Process XYZ.exe (8512)
Loading Module: _smoothers_lowess.cp37-win32.pyd. Without Debug-Infos. Base address: $2C050000. Process XYZ.exe (8512)
Loading Module: _contour.cp37-win32.pyd. Without Debug-Infos. Base address: $2C280000. Process XYZ.exe (8512)
Loading Module: ft2font.cp37-win32.pyd. Without Debug-Infos. Base address: $2C2B0000. Process XYZ.exe (8512)
Loading Module: _png.cp37-win32.pyd. Without Debug-Infos. Base address: $2C450000. Process XYZ.exe (8512)
Loading Module: kiwisolver.cp37-win32.pyd. Without Debug-Infos. Base address: $2C4D0000. Process XYZ.exe (8512)
Loading Module: _image.cp37-win32.pyd. Without Debug-Infos. Base address: $2C580000. Process XYZ.exe (8512)
Loading Module: _tri.cp37-win32.pyd. Without Debug-Infos. Base address: $2C680000. Process XYZ.exe (8512)
Loading Module: _qhull.cp37-win32.pyd. Without Debug-Infos. Base address: $2C6B0000. Process XYZ.exe (8512)
First Chance Exception at $20762F54. Exception-Class $C0000090 with Message 'floating point invalid operation at 0x20762f54'. Process XYZ.exe (8512)

This usually happens when using external libraries. Calling SetExceptionMask to mask floating point exceptions might help in such cases.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM