Python, вызывающий DLL, вызывающий Python, & quot; WindowsError: исключение: чтение нарушения доступа 0x00000004 & quot;

У меня есть приложение, написанное на Python.

Приложение вызывает некоторые функции в dll (используя ctypes), который вызывает некоторые функции из Python C API для загрузки и запуска некоторых функций в (другом) модуле python. Это вызывает WindowsError: exception: access violation reading 0x00000004 Некоторая отладка cout говорит мне, что нарушение прав доступа происходит при вызове Python C API.

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

Сначала я подумал, что, возможно, мне следует использовать Py_NewInterpreter в DLL, чтобы создать новое отдельное пространство для запуска этих функций модуля python. Это может показаться удобным, так как нет необходимости в приложении, а модули, запускаемые DLL, обмениваются любыми данными.
http://docs.python.org/2/c-api/init.html#Py_NewInterpreter

Однако мои первоначальные тесты с Py_NewInterpreter оказались безуспешными, просто допуская дальнейшие ошибки и сбои.

Поэтому мой вопрос заключается в том, как мне реализовать это / что мне нужно сделать, чтобы загрузка DLL модулей python работала?

1

Решение

Это похоже на разыменование нулевого указателя, т. Е. Указатель на структуру / класс равен нулю, и вы читаете подобъект со смещением 4. Посыпьте несколько assert () по всему коду, чтобы убедиться, что вы не пропустите ни одного нулевого указателя. Также обратите внимание, что Python C API регулярно возвращает ноль в случае исключения.

Тем не менее, у вас есть программа Python, импортирующая DLL через ctypes. Эта DLL в свою очередь встраивает интерпретатор Python через C API Python. Правильно? Если я не ошибаюсь, это фактически дает вам два экземпляра интерпретатора в одном процессе. Проблема в том, что любые глобальные объекты являются общими для обоих, и это может быть не скоординировано.

Я хотел бы написать правильный модуль Python (обертка) вместо использования ctypes для импорта DLL. Тем не менее, есть еще одна вещь, которую я бы сделал параллельно, и это спросить в списке рассылки пользователей Python, может ли эта настройка работать и почему. На ваш выбор также есть новостной шлюз.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]