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, i.e. 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.