繁体   English   中英

Python 2-为什么“ with”在嵌入式C代码中表现不同?

[英]python 2 - why does 'with' behave differently in embedded c code?

我正在尝试在ac / c ++ DLL中使用python 2.7.5。 此DLL由另一个使调试成为挑战的应用程序使用。 经过数小时的努力,我已经将问题隔离到“ with”语句中读取的文件引发异常的地方。 我不明白...如果正确实施,“ with”应该吸收异常,对吗? 无论如何,从命令行调用相同的python代码完全没有问题。

我的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 python返回一个不同的结果,即从PyObject_CallObject调用相同的代码? 为什么“ with”在这里表现不同?

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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM