Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Проблема с импортом Bokeh в исполняемые файлы Python: Исключение плавающей точки в C-API

Delphi , Синтаксис , API реализация

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

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

В коде Delphi, который уже загружает Python DLL в процесс exe, используется следующий подход:

// 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: ... (перечисление загружаемых DLL)
First Chance Exception at ... с сообщением 'floating point invalid operation at 0x...'

Возможное решение

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

SetExceptionMask([exInvalidOp, exDenormalized, exZeroDivide, exOverflow, exUnderflow, exPrecision])

Альтернативный ответ

Дополнительных альтернативных решений в контексте данного вопроса не представлено.

Заключение

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


Данная статья предназначена для разработчиков, использующих Delphi и Pascal, и может служить полезным руководством при работе с Python, встроенным в исполняемые файлы, и при решении проблем, связанных с внешними библиотеками и исключениями плавающей точки.

Создано по материалам из источника по ссылке.

Проблема связана с ошибкой плавающей точки, возникающей при импорте библиотеки Bokeh в исполняемые файлы Python, созданные с использованием Delphi и C-API, что происходит на Python 3.7.3.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: API реализация ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 11:43:30/0.0051219463348389/1