如何在Python中调试:为什么pdb不会进入函数调用?

时间:2016-01-01 20:32:10

标签: python ipython pdb canopy

我已经找到了io.open()应该通过'utf-8'而不是'utf8'的错误。下面的最小可执行代码。为什么IPython回溯不表示行号,为什么pdb既没有报告错误是io.open函数调用,也没有报告io.open代码中的任何内容?我可以用pdb或IPython调试器或它上面的Canopy debugger分层来调试这个调试器吗?

检查我的IPython版本也令人困惑。 Canopy包管理器报告已安装ipython 4.0.0-3ipython4 4.0.0-9,但import IPython后跟IPython.version_info评估为(2, 4, 1, '')

Canopy代码编辑器中的

my_module.py

import io
def my_function(filename):
    with io.open(my_other_function(filename), u'r', u'utf8')
def my_other_function(text):
    return u'modified' + text

在IPython会话中:

In []: import pdb
In []: import my_module
In []: my_module.my_function(filename)

-------------------------------------------------------------------------
TypeError                 Traceback (most recent call last)
<ipython-input-5-4c50d9f6cb5c> in <module>()
----> 1 my_module.my_function(filename)

C:\my_module in my_function(filename)

TypeError: an integer is required 

In []: pdb.pm()
> c:\users\bbrown\documents\github\canvasapi-python\capi\my_module.py(3)my_function()
-> with io.open(my_other_function(filename), u'w', u'utf8') as filehandle:

(Pdb) up
> <ipython-input-14-f6d6cc2c1670>(1)<module>()
-> my_module.my_function('testjunk')

(Pdb) down
> c:\users\bbrown\documents\github\canvasapi-python\capi\my_module.py(3)my_function()
-> with io.open(my_other_function(filename), u'w', u'utf8') as filehandle:

(Pdb) args
filename = testjunk

(Pdb) down
*** Newest frame

鉴于'utf-8'可以正常作为参数,TypeError令人惊讶,除非来自open的代码,但是对open的调用没有放在堆栈,至少不能从pdb导航。感谢您帮助我和其他人学习如何更有效地调试!

1 个答案:

答案 0 :(得分:3)

io.open是一个内置函数:

In [8]: import io

In [9]: type(io.open)
Out[9]: builtin_function_or_method

它不是用Python编写的,因此调试器无需调试。您的错误是由于将不正确的参数传递到io.open

引起的
open(file, mode='r', buffering=-1, encoding=None,
     errors=None, newline=None, closefd=True, opener=None) -> file object

您传递了'utf-8'作为第三个参数,但由于buffering应该是一个整数,因此该函数引发了一个描述性TypeError。您可以通过使encoding成为关键字参数来修复它:

io.open(filename, mode='r', encoding='utf8')

此外,您不需要明确导入io模块。 open内置函数完全相同:

In [15]: open
Out[15]: <function io.open>