Python处理.net异常使PyQt无法使用OLE

我有一个基于PyQt4的大型
Python程序.在某些地方,它需要能够控制制造商提供.net接口的硬件.我需要能够加载相关的库(如果可用),否则忽略它.

如果库不存在,并且我尝试报告异常,则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”替换except块),代码也运行正常.不知何故,试图查看异常会弄乱.net接口.

在尝试将库添加为引用之前,是否有更好的方法来检查库是否存在?有没有办法在运行QApplication之前重置.net连接,以保证将来不会发生这种事情?任何想法为什么会出现这个问题

最佳答案 有一种比尝试clr.AddReference()更好的方法 – 该方法称为clr.FindAssembly(‘DOT_NET_Assembly_Name’),它返回程序集的完整路径或None.

点赞