gpt4 book ai didi

python 2 - 为什么 'with' 在嵌入式 c 代码中的行为不同?

转载 作者:行者123 更新时间:2023-11-28 06:17:20 25 4
gpt4 key购买 nike

我正在尝试在 c/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 block ; fileptr 也永远不会绑定(bind)到 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)

关于python 2 - 为什么 'with' 在嵌入式 c 代码中的行为不同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30015087/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com