Python 2如何调试exec块

时间:2016-05-11 00:48:40

标签: python debugging exec

项目为pywebsocket,以标准模式运行。

处理程序从文件中读入并通过exec <code-block-in-string> in global_dic运行。然后处理程序代码通过global_dic[<function-name>]挂钩。请求URL时,将通过资源处理程序映射调用处理函数。

如何处理exec块中处理程序中的代码?具体来说你是如何在PyCharm中做到的?还是在其他工具?

或者更一般地说,如何在exec块中调试代码?

对于特定代码,处理程序由函数mod_pywebsocket/dispatch.py读入并在_source_handler_file()中提供,就像(实际打开和读取在调用此函数之前一样,但只是将其放在下面以解释逻辑):

global_dic = {}
handler_definition = open(handler_definition_filepath).read()
exec handler_definition in global_dic
handler = global_dic[handler_name]
return _HandlerSuite(handler)

然后_HandlerSuite的实例由主循环保存在映射中,并由主循环用于基于URL资源调用处理程序。

gbin回答后更新:

代码看起来应该是基于gbin的例子:

print(3)
toto = 5
def my_handler_func():
    print(88)

在py2下:

execfile('other.py', blob)       # this works perfectly
print("blob %s" % blob['toto'])  # 
myhandler = blob['my_handler_func']
myhandler()                      # how to make this stop on print(88)?

代码将在执行execfile()时停止在PyCharm中。

但是当它调用注入的处理程序myhandler()时,我希望它在注入的代码块内的print(88)停止。这还没有解决。

要解决问题的后半部分,可能解决方法是将代码拉入Python系统的导入模块记录中。也许使用__import__。但这会污染名称空间。有没有更好的办法?或者有没有办法导入,但仍然保持名称空间隔离?

再次更新:

今天我用execfile("...", blob)解决了相同的代码,它只是起作用了。它停止在注入的处理函数上。不知道为什么它前几天没用。

1 个答案:

答案 0 :(得分:4)

如果你可以更改/ override / monkeypatch dispatch.py​​,你可以在python 3下使用execfile()或exec(compile(...)):

如果您有other.py文件:

print(1)
print(2)
print(3)
toto = 5

在py2下:

execfile('other.py', blob)
print("blob %s" % blob['toto'])

只是在py3下的FYI:

code_block = compile(open('other.py').read(), 'other.py', 'exec')
blob = {}
exec(code_block, blob)
print("blob %s" % blob['toto'])

现在如果你在other.py中放一个断点,pycharm会停在它上面!