2015-05-03 16 views
0

我想在c/C++ DLL中使用python 2.7.5。這個DLL被另一個已經調試過挑戰的應用程序使用。在幾個小時之後,我將這個問題隔離開來,然後在'with'語句中讀取的文件拋出異常。這我不明白...'與'應吸收異常,如果正確實施,對吧?無論如何,從命令行調用相同的python代碼根本沒有問題。python 2 - 爲什麼'with'在嵌入式c代碼中表現不同?

我的C/CPP DLL調用這個...

def parsetest(filename): 
    bytesin = getMD3Bytes(filename) 
    return bytesin 

def getMD3Bytes(filename): 
    filename = 'lower.md3' 
    bytes = '' 
    valuetoreturn = 1 
    try: 
      with open(filename,'rb') as fileptr: 
       if fileptr != None: 
        bytes = fileptr.read() 
        valuetoreturn = 333 
    except: 
      valuetoreturn = 991 
    return valuetoreturn 

如果DLL運行通過這個代碼...

pValue = PyObject_CallObject(pFunc, arguments); 

,並通過...

iResult = PyInt_AsLong(pValue); 
得到的結果

iResult的值爲991而不是333,這隻有在'with'內沒有發生異常時纔會發生。我知道,因爲我有應用程序調用DLL彈出一個消息框與iResult它。

更有趣的對我來說,這個工程......

C:\Program Files (x86)\DeleD CE\Plugins>python 
Python 2.7.5 (default, May 15 2013, 22:43:36) [MSC v.1500 32 bit (Intel)] on win32 
Type "help", "copyright", "credits" or "license" for more information. 
>>> import parseMD3 
>>> testval = parseMD3.parsetest('junk') 
>>> print testval 
333 
>>> exit() 

那麼,爲什麼CLI蟒蛇返回不同的結果,從PyObject_CallObject相同的代碼被調用?爲什麼'與'在這裏有不同的表現?

回答

1

with不處理異常。它只確保文件在發生異常時關閉。如果open()表達式本身發生異常,則不會輸入with塊; fileptr也不會被綁定到None

您正在捕獲所有異常,包括鍵盤中斷和內存錯誤,因此我們無法開始說明爲什麼在此處運行C++控制時代碼失敗。

棒一組有限的例外,而不是像IOError,並登錄正確的例外:

import logging 

logger = logging.getLogger('__name__') 

def getMD3Bytes(filename): 
    filename = 'lower.md3' 
    bytes = '' 
    valuetoreturn = 1 
    try: 
     with open(filename,'rb') as fileptr: 
      bytes = fileptr.read() 
      valuetoreturn = 333 
    except IOError: 
     logger.exception('Failed to open file properly') 
     valuetoreturn = 991 
    return valuetoreturn 

記錄程序的默認配置將輸出到stderr,但你可以將其配置爲記錄到一個文件相反:

logging.basicConfig(filename='/tmp/debug.log', level=logging.DEBUG) 
+0

你是對的......我誤解了'正在'與'做什麼是我的問題。 IOError返回錯誤代碼2(無法找到文件)。通過指定「C:/ Program Files(x86)/ DeleD CE/Plugins/lower.md3」而不是「lower.md3」來修復它。 –

相關問題