загрузка боке во встроенные Python DLL падает - PullRequest
0 голосов
/ 15 апреля 2019

Python (3.7.3) встроен в исполняемый файл через C-API. Когда Python Script загружается с функцией PyImport_Import() и скрипт содержит импорт bokeh, т.е. from bokeh.plotting import figure процесс загрузки преждевременно завершается с исключением с плавающей запятой.

Исполняемый файл написан на Delphi, но его Python API почти идентичен исходному C-API. Я загрузил много других модулей без проблем. Bokeh является первым, который не может быть загружен.

Вызывающая программа Delphi с уже загруженным в процесс exe файлом python

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

и скрипт Python

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!')

В следующем журнале событий перечислены dll, загруженные в процесс, и показаны только последние записи, которые, судя по их именам, связаны с графическими функциями. И, наконец, сгенерированная ошибка.

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)

1 Ответ

1 голос
/ 15 апреля 2019

Обычно это происходит при использовании внешних библиотек. В таких случаях может помочь вызов SetExceptionMask для маскировки исключений с плавающей запятой.

...