[英]Why does this argparse code behave differently between Python 2 and 3?
[英]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.