调试

因为xlwings可以在每种Python环境中运行,因此你可以选择自己喜欢的环境进行调试。

  • RunPython: 通过 RunPython 调用Python时,可以设置一个 mock_caller 以便可以在Excel和Python的函数调用之间自由切换。

  • UDFs: 为了调试用户定义函数,xlwings提供了一个方便的调试服务器。

首先,Excel会在消息框中显示Python错误:

_images/debugging_error.png

注解

在Mac系统中,如果在 xlwings 被导入之前就有模块或程序包导入失败,不会弹出提示框、状态栏也不会重置。 但是,错误信息仍旧会写入日志文件(/Users/<User>/Library/Containers/com.microsoft.Excel/Data/xlwings.log)。

RunPython

考虑Python源文件 my_module.py 里的示例代码:

# my_module.py
import os
import xlwings as xw

def my_macro():
    wb = xw.Book.caller()
    wb.sheets[0].range('A1').value = 1

if __name__ == '__main__':
    # Expects the Excel file next to this source file, adjust accordingly.
    xw.Book('myfile.xlsm').set_mock_caller()
    my_macro()

现在 my_macro() 既可以从Python中轻松调试,又可以从Excel中通过 RunPython 来调试,用不着修改源代码:

Sub my_macro()
    RunPython "import my_module; my_module.my_macro()"
End Sub

UDF测试服务器

仅适用于Windows系统:要调试UDF,只需要在xlwings的 Add-in & Settings 功能区的VBA模块上部选中 Debug UDFs , 然后再Python源文件的结尾加上下面几行,就可以进行测试了。根据调试时用的Python集成环境,可能需要使用调试模式来运行代码(比如,使用PyCharm或者PyDev时):

if __name__ == '__main__':
    xw.serve()

接下来,当你刷新工作表时(用 Ctrl-Alt-F9),代码会停止你设置的断点处,或者会输出你设置过的打印信息。

下面的截图显示了这PyCharm的社区版集成环境中,代码停在断点处的情况:

_images/udf_debugging.png

注解

当从命令行启动调试服务器的时候,现在这个版本中要终止服务器还没有什么比较优雅的办法,只能是通过关掉命令行窗口来停止进程。