У меня есть большая программа на основе PyQt4 на основе Python. В некоторых местах он должен иметь возможность управлять аппаратным обеспечением, для которого производитель предоставляет интерфейс .net. Мне нужно иметь возможность загружать соответствующую библиотеку, если она доступна, и игнорировать ее в противном случае.Исключения для обработки Python .net делает PyQt неспособным использовать OLE
Если библиотеки нет, и я пытаюсь сообщить об исключении, то Qt сообщает об ошибке инициализации OLE, и все функции перетаскивания и копирования/вставки в моей программе завершаются с ошибкой.
Вот минимальный пример:
import clr
import sys
from PyQt4 import QtGui
import logging
logger = logging.getLogger(__name__)
try:
clr.AddReference('foo') #This doesn't exist
except Exception as e:
logger.info('Exception: {0}'.format(e))
app = QtGui.QApplication(sys.argv)
app.exec_()
Это приводит к ошибке Qt:
Qt: Could not initialize OLE (error 80010106)
Программа работает, но всякий раз, когда я пытаюсь копировать/вставить, я получаю:
QClipboard::setMimeData: Failed to set data on clipboard()
и перетаскивание не работает вообще.
Если библиотека существует, код запускается без проблем. Интересно, что если я не пытаюсь посмотреть на исключение (например, заменить исключающий блок на «pass»), код также отлично работает. Каким-то образом, пытаясь увидеть исключение, помешает интерфейс .net.
Есть ли лучший способ проверить, существует ли библиотека, прежде чем пытаться добавить ее в качестве ссылки? Есть ли способ сбросить соединение .net перед запуском QApplication, чтобы гарантировать, что такого рода вещи не произойдет в будущем? Любые идеи, почему эта проблема происходит?
Спасибо, это, безусловно, хорошее предложение. Однако на этот вопрос он не отвечает. Почему ловить и печатать исключение, созданное при попытке добавить несуществующую библиотеку, вызывают ошибку инициализации OLE? – jmizrahi
отвечает на первый из ваших 3 вопросов и решает проблему. основная причина - еще одна история. Вы задали вопрос о github? – denfromufa