# 调试
由于xlwings在每个Python环境中运行,因此您可以使用首选的调试方式。
* **RunPython**: 通过`RunPython`调用Python时,可以设置`mock_caller`,以便在从Excel和Python调用函数之间来回切换。
* **UDFs**: 对于调试用户自定义函数,xlwings提供了方便的调试服务器
首先,Excel将在消息框中显示Python错误:
![](https://i.vgy.me/ZOkXAl.png)
>[info]注意
在Mac上,如果在导入xlwings之前模块/包的`import`失败,则不会显示弹出窗口,也不会重置状态栏。 但是,错误仍将记录在日志文件中。 有关日志文件的位置,请参阅[加载项](addin.md)。
## 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运行以进行调试,并且可以通过`RunPython`从Excel运行而无需更改源代码:
~~~
Sub my_macro()
RunPython ("import my_module; my_module.my_macro()")
End Sub
~~~
## UDF debug server
仅限Windows:要调试UDF,只需检查[加载项](addin.md)中的`Debug UDFs`, xlwings VBA模块。 然后在Python源文件的末尾添加以下行并运行它。 根据您使用的IDE,您可能需要以“调试”模式运行代码(例如,如果您使用的是PyCharm或PyDev):
~~~
if __name__ == '__main__':
xw.serve()
~~~
重新计算工作表(`Ctrl-Alt-F9`)时,代码将在断点处停止或输出您可能具有的任何打印调用。
以下屏幕截图显示了在PyCharm社区版本的断点处停止的代码:
![](https://i.vgy.me/bdt8Gp.png)
>[info]注意
从命令提示符运行调试服务器时,目前没有优雅的方法来终止它,但关闭命令提示符将终止它。