2015-08-13 68 views
4

我有一個基於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」替換except塊),代碼也可以正常運行。不知何故,試圖看到異常混亂了.net界面。

有沒有更好的方法來檢查一個庫是否存在,然後再嘗試添加它作爲參考?在運行QApplication之前,是否有任何方法可以重置.net連接,以確保這種事情在未來不會發生?任何想法爲什麼發生這個問題?

回答

2

有一個比嘗試clr.AddReference()更好的方法 - 該方法被稱爲clr.FindAssembly('DOT_NET_Assembly_Name'),該方法返回裝配或None的完整路徑。

+0

謝謝,這絕對是一個很好的建議。但是,它並沒有真正回答這個問題。爲什麼捕獲並打印通過嘗試添加不存在的庫而生成的異常會導致OLE初始化錯誤? – jmizrahi

+0

它回答你的3個問題中的第一個,並解決問題。根本原因是另一回​​事。你在github上發佈了一個問題嗎? – denfromufa