介绍
调试是程序员查找的软件开发过程的一部分,然后解决阻止软件正常运行的问题。
一个有用和快速的调试工具是Python code
模块 ,因为它可以用来模拟交互式解释器。 该模块还为您提供了用Python编写代码的机会。
了解code
模块
您可以将code
模块添加到Python程序中,以指示程序停止执行并进入交互模式,以便检查代码是如何工作的。 code
模块是Python标准库的一部分。
这是有用的,因为您可以利用解释器,而不会牺牲编程文件可提供的复杂性和持久性。 通过使用code
模块,您可以避免在整个code
使用print()
语句作为一种调试方式,随着时间的推移可能变得笨拙。
要使用该模块作为调试方法,可以使用模块的interact()
函数,该函数在调用点停止执行程序,并为您提供一个交互式控制台,以便您可以检查您的程序的当前状态。
具有可能参数的功能如下:
code.interact(banner=None, readfunc=None, local=None, exitmsg=None)
此函数运行一个read-eval-print循环,并创建一个InteractiveConsole
类的对象实例,它可以模拟交互式Python解释器的行为。
可选参数如下:
-
banner
可以设置为一个字符串,以便您可以标记解释器启动的位置 -
readfunc
可以用作InteractiveConsole.raw_input()
方法 -
local
将设置解释器循环的默认命名空间 - 可以将
exitmsg
设置为一个字符串,以记录解释器结束的位置
使用local
参数,您可以使用,例如:
-
local=locals()
localalslocal=locals()
为本地命名空间 -
local=globals()
用于全局命名空间 -
local=dict(globals(), **locals())
来使用全局命名空间和当前的本地命名空间
请注意,对于Python 3.6, exitmsg
参数是新的,因此,如果您使用的是旧版本的Python,请更新它或者离开exitmsg
参数。
您可以将interactive interact()
函数放在程序中要在代码中启动交互式解释器。
使用code
模块
我们来看看这个在一个名为balances.py
的银行帐户余额计划的上下文中。 我们将local
参数设置为locals()
来将命名空间设置为local。
# Import code module
import code
bal_a = 2324
bal_b = 0
bal_c = 409
bal_d = -2
account_balances = [bal_a, bal_b, bal_c, bal_d]
def display_bal():
for balance in account_balances:
if balance < 0:
print("Account balance of {} is below 0; add funds now."
.format(balance))
elif balance == 0:
print("Account balance of {} is equal to 0; add funds soon."
.format(balance))
else:
print("Account balance of {} is above 0.".format(balance))
# Use interact() function to start the interpreter with local namespace
code.interact(local=locals())
display_bal()
我们使用函数code.interact()
与local=locals()
参数在解释器循环中使用本地命名空间作为默认值。
让我们运行上面的程序,如果我们不在虚拟环境中,使用python3
命令,或者如果我们是python
命令:
python balances.py
一旦我们运行该程序,我们将最初收到以下输出:
Python 3.6.1 (default, Apr 4 2017, 09:40:51)
[GCC 4.2.1 Compatible Apple LLVM 8.0.0 (clang-800.0.42.1)] on darwin
Type "help", "copyright", "credits" or "license" for more information.
(InteractiveConsole)
>>>
您的光标将放置在>>>
行的末尾,就像在Python交互式shell中一样。
从这里可以发出打印变量,函数等的调用。
>>> print(bal_c)
409
>>> print(account_balances)
[2324, 0, 409, -2]
>>> print(display_bal())
Account balance of 2324 is 0 or above.
Account balance of 0 is equal to 0, add funds soon.
Account balance of 409 is 0 or above.
Account balance of -2 is below 0, add funds now.
None
>>> print(display_bal)
<function display_bal at 0x104b80f28>
>>>
我们看到,通过使用本地命名空间,我们可以打印变量并调用该函数。 最终的print()
调用显示了计算机内存中display_bal
函数的位置。
一旦您对使用解释器所能检查的内容感到满意,您可以按* CTRL + D
键入基于* nix的系统,或者使用基于Windows的系统的CTRL + Z
离开控制台并继续执行该程序。
如果您想在不运行程序剩余部分的情况下离开控制台,可以通过键入quit()
来执行此操作,程序将被中止。
要使用banner
和exitmsg
参数,我们可以这样做:
...
# Use interact() function to start the interpreter
code.interact(banner="Start", local=locals(), exitmsg="End")
display_bal()
当我们运行程序时,我们将在运行程序时收到以下输出:
Start
>>>
使用banner
参数可以允许您在代码中设置多个点,并使您能够识别它们。 例如,您可以使用打印"In for-loop"
For "In for-loop"
的exitmsg
打印"In for-loop"
的exitmsg
,以便您可以准确地了解代码中的哪些位置。
从这里,我们可以照常使用翻译。 一旦我们键入CTRL + D
退出解释器,我们将收到退出消息,该函数将运行:
End
Account balance of 2324 is 0 or above.
Account balance of 0 is equal to 0, add funds soon.
Account balance of 409 is 0 or above.
Account balance of -2 is below 0, add funds now.
该程序现在在交互式会话之后已经完全运行。
完成使用code
模块调试代码后,您应该删除code
函数和导入语句,以使程序按照常规运行。 code
模块提供一个实用程序,所以一旦完成,重要的是要清理自己。
结论
使用code
模块启动交互式控制台可以让您查看代码在细粒度级别上执行的操作,以了解其行为并根据需要进行更改。 要了解更多信息,可以阅读code
模块的官方文档 。
要了解有关可以用来调试Python代码的其他方法的更多信息,请阅读我们关于如何使用Python调试器pdb
的教程。