Необработанное исключение в multiarray.pyd при втором запуске программы

Я делаю плагин .dll на С++ и встраиваю в него python 2.7.

Все работало нормально с простыми программами .py, пока я не импортировал большую программу. Самое странное, что в первый раз программа запускается без проблем, а во второй раз возникает исключение:

Unhandled exception at 0x6731ADA1 (multiarray.pyd) in EuroScope.exe: 0xC0000005: Access violation writing location 0x00000001.

(Все папки и модули Lib/Dll копируются в папку .exe)

Я искал в Интернете, и есть несколько человек с той же ошибкой, но решения, которые сработали для них, не для меня. Например, здесь

Я знаю, что это очень специфическая ошибка, но я надеюсь, что кому-то уже удалось ее обойти. Я не буду публиковать код здесь, потому что я думаю, что он не имеет отношения к этой ошибке, а также потому, что он слишком длинный.

Изменить: мне удалось увидеть, что проблема именно в import numpy


person João Pereira    schedule 17.04.2014    source источник
comment
Вам нужно запустить его в отладчике. Это исключение выглядит так, будто программа пытается записать по адресу 1 (что, конечно же, незаконно). Единственный способ решить эту проблему — посмотреть, какая часть кода это делает.   -  person trojanfoe    schedule 19.04.2014


Ответы (2)


Мне удалось обойти эту проблему. Кажется, что некоторые модули имеют проблемы, когда их процедуры инициализации вызываются более одного раза, и numpy является одной из них. Решение состоит в том, чтобы вызвать Py_Finalize() только один раз в самом конце программы. Py_Initialize() можно вызывать сколько угодно раз, как будто Python уже инициализирован, Py_Initialize() — это неоперативная...

А также обнаружил, что это решение ускоряет работу приложения, поскольку python не нужно перезапускать каждый раз, когда происходит вызов какой-либо его функции.

Подробнее об этом здесь

person João Pereira    schedule 19.04.2014

Аналогичная проблема возникает с библиотеками pyHook и pyxhook. Потратил много времени, чтобы выяснить причину сбоя этих двух модулей, но в Интернете нет подсказок. Теперь я обнаружил, что это происходит и с numpy. Надеюсь, что в этот раз Py_Finalize() решит обе мои проблемы.

Проблема решена после отключения поддержки потоков Python в моем встроенном коде интерпретатора путем комментирования следующего. Кстати, я запускаю интерпретатор уже в потоке POSIX, созданном моим кодом C.

//PyEval_InitThreads();
//gstate = PyGILState_Ensure();
//PyGILState_Release(gstate);

Теперь я могу много раз запускать свой py.script с помощью numpy и pyHook. Однако это вызовет следующее сообщение об ошибке в конце кода C, если модуль thread импортируется в скрипт python напрямую или любым другим импортированным модулем.

Exception KeyError: KeyError(14288,) in <module 'threading' from 'C:\python27\Lib\threading.pyc'> ignored

Тем не менее я чувствую, что нужно лучшее решение.

person abhijit    schedule 30.11.2014