1. python语言中如何调试程序
把关键的中间变量print出来,看看是不是和预期的一样。
2. 如何调式python程序
程序能一次写完并正常运行的概率很小,基本不超过1%。总会有各种各样的bug需要修正。有的bug很简单,看看错误信息就知道,有的bug很复杂,我们需要知道出错时,哪些变量的值是正确的,哪些变量的值是错误的,因此,需要一整套调试程序的手段来修复bug。
第一种方法简单直接粗暴有效,就是用print把可能有问题的变量打印出来看看:
# err.py
def foo(s):
n = int(s)
print '>>> n = %d' % n
return 10 / n
def main():
foo('0')
main()
执行后在输出中查找打印的变量值:
$ python err.py
>>> n = 0
Traceback (most recent call last):
...
ZeroDivisionError: integer division or molo by zero
用print最大的坏处是将来还得删掉它,想想程序里到处都是print,运行结果也会包含很多垃圾信息。所以,我们又有第二种方法。
断言
凡是用print来辅助查看的地方,都可以用断言(assert)来替代:
# err.py
def foo(s):
n = int(s)
assert n != 0, 'n is zero!'
return 10 / n
def main():
foo('0')
assert的意思是,表达式n != 0应该是True,否则,后面的代码就会出错。
如果断言失败,assert语句本身就会抛出AssertionError:
$ python err.py
Traceback (most recent call last):
...
AssertionError: n is zero!
程序中如果到处充斥着assert,和print相比也好不到哪去。不过,启动Python解释器时可以用-O参数来关闭assert:
$ python -O err.py
Traceback (most recent call last):
...
ZeroDivisionError: integer division or molo by zero
关闭后,你可以把所有的assert语句当成pass来看。
logging
把print替换为logging是第3种方式,和assert比,logging不会抛出错误,而且可以输出到文件:
# err.py
import logging
s = '0'
n = int(s)
logging.info('n = %d' % n)
print 10 / n
logging.info()就可以输出一段文本。运行,发现除了ZeroDivisionError,没有任何信息。怎么回事?
别急,在import logging之后添加一行配置再试试:
import logging
logging.basicConfig(level=logging.INFO)
看到输出了:
$ python err.py
INFO:root:n = 0
Traceback (most recent call last):
File "err.py", line 8, in <mole>
print 10 / n
ZeroDivisionError: integer division or molo by zero
这就是logging的好处,它允许你指定记录信息的级别,有debug,info,warning,error等几个级别,当我们指定
level=INFO时,logging.debug就不起作用了。同理,指定level=WARNING后,debug和info就不起作用了。这样一
来,你可以放心地输出不同级别的信息,也不用删除,最后统一控制输出哪个级别的信息。
logging的另一个好处是通过简单的配置,一条语句可以同时输出到不同的地方,比如console和文件。
pdb
第4种方式是启动Python的调试器pdb,让程序以单步方式运行,可以随时查看运行状态。我们先准备好程序:
# err.py
s = '0'
n = int(s)
print 10 / n
然后启动:
$ python -m pdb err.py
> /Users/michael/Github/sicp/err.py(2)<mole>()
-> s = '0'
以参数-m pdb启动后,pdb定位到下一步要执行的代码-> s = '0'。输入命令l来查看代码:
(Pdb) l
1 # err.py
2 -> s = '0'
3 n = int(s)
4 print 10 / n
[EOF]
输入命令n可以单步执行代码:
(Pdb) n
> /Users/michael/Github/sicp/err.py(3)<mole>()
-> n = int(s)
(Pdb) n
> /Users/michael/Github/sicp/err.py(4)<mole>()
-> print 10 / n
任何时候都可以输入命令p 变量名来查看变量:
(Pdb) p s
'0'
(Pdb) p n
0
输入命令q结束调试,退出程序:
(Pdb) n
ZeroDivisionError: 'integer division or molo by zero'
> /Users/michael/Github/sicp/err.py(4)<mole>()
-> print 10 / n
(Pdb) q
这种通过pdb在命令行调试的方法理论上是万能的,但实在是太麻烦了,如果有一千行代码,要运行到第999行得敲多少命令啊。还好,我们还有另一种调试方法。
pdb.set_trace()
这个方法也是用pdb,但是不需要单步执行,我们只需要import pdb,然后,在可能出错的地方放一个pdb.set_trace(),就可以设置一个断点:
# err.py
import pdb
s = '0'
n = int(s)
pdb.set_trace() # 运行到这里会自动暂停
print 10 / n
运行代码,程序会自动在pdb.set_trace()暂停并进入pdb调试环境,可以用命令p查看变量,或者用命令c继续运行:
$ python err.py
> /Users/michael/Github/sicp/err.py(7)<mole>()
-> print 10 / n
(Pdb) p n
0
(Pdb) c
Traceback (most recent call last):
File "err.py", line 7, in <mole>
print 10 / n
ZeroDivisionError: integer division or molo by zero
这个方式比直接启动pdb单步调试效率要高很多,但也高不到哪去。
IDE
如果要比较爽地设置断点、单步执行,就需要一个支持调试功能的IDE。目前比较好的Python IDE有PyCharm:
3. linux怎么调试python
#!/usr/bin/python
from ftplib import FTP
import sys
import socket
import pdb
def passwordCorrect(ip,port,username,password):
try:
client = FTP()
pdb.set_trace()
client.connect(ip,port)
client.login(username,password)
client.close()
except Exception, e:
pdb.set_trace()
client.close()
if str(e).find('unknown IP address')!=-1:
return 2
return 0
print "correct"
return 1
4. python 怎么用ide调试
方法很多,你打开Python IDE(GUI)后,界面跟cmd命令行很类似,如果你写的程序很复杂当然不适合这种方式了,可以直接-------File-NewFile,这个时候就会出来一个Untitled窗口,你在这里开始写程序就行了,最后保存下,就是一个**.py的python程序了,至于怎么运行它,你可以打开这个**.py文件,直接按F5就行,也可以在cmd窗口里用python **.py都可以
5. 如何进行Python 调试器调试
PyDev 就能显示出一个超链接,这样您可以在导入库或函数的源代码之间导航。请注意,为了在您自己的源代码中跨模块使用该特性(从一个模块链接到另一个模块),必须修改 PYTHONPATH 环境变量。在其中加入这些模块,这样 PyDev 就可以找到它们了。Python 调试器是最近才加入 PyDev 插件中的。要使用调试器,可在 Python 编辑器中想中断的代码行的左侧点击,设置断点。我在feedparser.py 的 1830 行处设置了断点。然后在 Navigator 视图中选择这个 Python 模块,点击右键,选择“Python > Debug...”。这时将显示与前面相似的一个启动配置窗口。点击 Debug 进入 Debug 视角,同时启动调试器。 左上角的 Debug 视图显示当前正在执行的进程和线程,右上角的 Variables 视图显示当前运行域中的所有变量。Python 编辑器会显示调试器目前停在哪条语句上,同时所有的输出信息都显示与 Console 视图中。调试器可以通过 Debug 视图底部的按钮或 Run 菜单进行控制。 要运行刚刚在 Eclipse 中创建的启动器,可选择 Run > External Tools > pythonInterpreter。Python 解释器的输出显示在 Console 视图中。Console 中可输入 Python 调试器并执行,就像从命令行中执行 Python 一样。为导入并在交互模式下使用模块,您需要将模块的位置增加到 PYTHONPATH 环境变量中。 Python 会在它需要的时候自动编译模块。这意味着 Python 调试器通常不必显式地对模块进行编辑。即便如此。有时候手工编译 Python 代码还是很有用的,同时,构建和部署过程中还有很多其他方面的内容可以自动化实现。这也正是构建工具的用武之地。 我将着重介绍来自 Java 编程世界中的 Apache Ant,这个工具可大量应用在 Python 开发中。Apache Ant 是 Java 编程领域内事实上的标准构建工具。它更加轻便,与 Java 技术结合得更好,可用于替代其他的构建工具。Ant 可以在支持 Java 编程语言的任何一种平台上运行。尽管我们需要的大多数构建特性 Ant 都已经提供了,但如果要将 Ant 用做 Python 构建工具,还是需要有一些关键的与 Python 相关的特性。我已经开发了若干定制的 Ant 插件(用 Ant 的行话讲叫做 task),可提供构建 Python 时需要的特定于 Python 的特性。 Ant 用 XML 作为描述构建的格式。build 文件组织为需要执行的目标。每一个目标都可能依赖于其他的目标。Ant 将根据您所请求执行的目标,以及一组依赖目标,来执行任何需要的目标。每一个目标都可能包含任意数量的 Ant 任务,而由 Ant 任务实际执行目标的工作。Ant 有很多内置的任务,可以完成诸如编译 Java 代码、生成文档、操纵文件和目录,同时第三方又提供了很多附加的任务。 我将通过为 feedparser 项目创建构建脚本来介绍 Ant 构建脚本和 Python Ant 任务的基础知识。为了使用 Python Ant 任务。您需要下载并安装包含这些任务的 Java 库。首先,从 参考资料 一节中列出的 URL 中下载 Python 调试器任务库(pyAntTasks.jar)。然后,将 JAR 文件拷贝到 Eclipse 的 Ant 插件下的 lib 目录中。这应该是 Eclipse 安装目录下形如 plugins/org.apache.ant_1.5.3 的子目录。 Python Ant 任务库拷贝完毕之后,必须在 Eclipse 中启用库。选择 Window > Preferences,然后选择 Ant > Runtime。将Ant Home Entries 展开,其中可看到 Eclipse 使用的库(JAR 文件)列表。选择“ Add JAR”,然后从 Eclipse Ant 插件的 lib 目录中选择 Python Ant JAR 文件,就可以将刚刚拷贝的 Python Ant JAR 文件加入库列表中。您现在应该能够创建和运行包含 Python 任务的 Ant 构建脚本了。下面进入构建脚本内部!
6. 调试python代码的方法有哪些
本文讨论在没有方便的IDE工具可用的情况下,使用pdb调试python程序
源码例子
例如,有模拟税收计算的程序:
#!/usr/bin/python
def debug_demo(val):
if val <= 1600 :
print "level 1"
print 0
elif val <= 3500 :
print "level 2"
print (val - 1600) * 0.05
elif val <= 6500 :
print "level 3"
print (val - 3500) * 0.10 + (3500-1600) * 0.05
else:
print "level 4"
print (val - 6500) * 0.20 + (6500-3500) * 0.10 + (3500-1600) * 0.05
#~def debug_demo
if __name__ == "__main__":
debug_demo(4500)
debug_demo函数计算4500的入账所需的税收。
如何调试?
1.加入断点
在需要插入断点的地方,加入红色部分代码:如果_DEBUG值为True,则在该处开始调试(加入_DEBUG的原因是为了方便打开/关闭调试)。
#!/usr/bin/python
_DEBUG=True
def debug_demo(val):
if _DEBUG == True:
import pdb
pdb.set_trace()
if val <= 1600 :
print "level 1"
print 0
elif val <= 3500 :
print "level 2"
print (val - 1600) * 0.05
elif val <= 6500 :
print "level 3"
print (val - 3500) * 0.10 + (3500-1600) * 0.05
else:
print "level 4"
print (val - 6500) * 0.20 + (6500-3500) * 0.10 + (3500-1600) * 0.05
#~def debug_demo
if __name__ == "__main__":
debug_demo(4500)
2.开始运行调试
运行程序./debug_demo.py,得到
> /usr/local/qspace/user_network/debug_demo.py(7)debug_demo()
-> if val <= 1600 :
(Pdb)
-> val <= 1600 : 指示当前执行的语句,(Pdb)等待你的调试指令. pdb的指令很丰富,输入h指令可以查看指令的使用方法。下面简单介绍常用指令:
查看代码上下文,l(小写L)
(Pdb) l
2 _DEBUG=True
3 def debug_demo(val):
4 if _DEBUG == True:
5 import pdb
6 pdb.set_trace()
7 -> if val <= 1600 :
8 print "level 1"
9 print 0
10 elif val <= 3500 :
11 print "level 2"
12 print (val - 1600) * 0.05
(Pdb)
左边是行号,右边是代码正文。
监视变量:p 变量名
(Pdb) p val
4500
(Pdb)
单步执行: n
-> elif val <= 3500 :
(Pdb) l
5 import pdb
6 pdb.set_trace()
7 if val <= 1600 :
8 print "level 1"
9 print 0
10 -> elif val <= 3500 :
11 print "level 2"
12 print (val - 1600) * 0.05
13 elif val <= 6500 :
14 print "level 3"
15 print (val - 3500) * 0.10 + (3500-1600) * 0.05
加入断点:b 行号
(Pdb) b 14
运行到断点: c
(Pdb) c
> /*****
-> print "level 3"
(Pdb) l
9 print 0
10 elif val <= 3500 :
11 print "level 2"
12 print (val - 1600) * 0.05
13 elif val <= 6500 :
14 B-> print "level 3"
15 print (val - 3500) * 0.10 + (3500-1600) * 0.05
16 else:
17 print "level 4"
18 print (val - 6500) * 0.20 + (6500-3500) * 0.10 + (3500-1600) * 0.05
19
执行到函数返回前: r
(Pdb) r
level 3
195.0
--Return--
> /****()
->None
-> print (val - 3500) * 0.10 + (3500-1600) * 0.05
(Pdb)
说明:
pdb还有很多其他很多有用的指令,读者可以自行探索。输入h,h 命令。就可以得到命令的详细帮助。
不过,我个人认为一般无需启动这种调试方法,一般使用日志输出进行调试即可,除非遇到了非常微妙的错误。这时,单步调试的威力便显示出来了
7. python代码怎么debug
在需要插入断点的地方,加入红色部分代码:如果_DEBUG值为True,则在该处开始调试(加入_DEBUG的原因是为了方便打开/关闭调试)。
#!/usr/bin/python
_DEBUG=True
def debug_demo(val):
if _DEBUG == True:
import pdb
pdb.set_trace()
8. python debug怎么用
1.打开pycharm,新建一个python程序,命名为excel.py。
2.直接贴出代码,如果是hello world就不存调试的问题了!
相关推荐:《Python基础教程》
3.介绍调试的菜单操作,在【菜单栏】选择【RUN】,下拉菜单里选择【debug excel.py】或者【Debug...】,这两个功能是一样的,都是调试功能。
4.介绍快捷键调试,调试:CTRL+SHLFT+F9,执行是CTRL+SHLFT+F10,当前调试SHLFT+F9,当前执行SHLFT+F10,还有很多,
5.贴出调试的结果,会具体提示一些警告或者异常,因为本例已经调试过,所以没有异常。
9. 怎么调试python脚本
打开pycharm community 2019.1软件,创建一个项目。
创建一个py后缀的文件作为示范,文件名自己定义。
相关推荐:《Python基础教程》
编写代码,然后右键点击进行运行,查看一下是否有问题。
点击右上角的虫子图标,然后下面会有控制面板出来,点击Debugger,然后我们在行号那里选择要调试哪一行,点击就会有红点。
再点击虫子图标,这个时候就可以开始调试了,点击step over或者快捷键f8就可以调试了。
但是我们可以看出就直接跳过函数内部,对于函数内部的调试,我们则需要点击step into,或者快捷键f7,这样才可以调试内部。
10. 如何在 Python 中使用断点调试
在eclipse下可以单步调试python的方法:
1、右键单击标尺栏添加断点
2、将鼠标移至需要添加断点的代码行,使用快捷键 Ctrl+F10,在弹出的菜单栏中选择 ”Add Breakpoint” 添加断点。
添加好断点后,选择 Debug As -> Python Run 启动调试器,弹出一个对话框,询问是否切换到调试器透视图,单击 Yes,即显示调试模式。
3、调试器透视图
程序调试过程中,常用的几个快捷键如下:
单步跳入 Step Into: F5
单步跳过 Step Over: F6
单步返回 Step Return: F7
重新开始 Resume: F8
在控制台 Console 中,显示出断点之前代码的执行结果。如果要查看某个变量的值,以变量 a 为例,可以手动在控制台中键入一行代码 ”print ‘a is:’, a”,再连续按两次 Enter 键,即显示出变量的值。