[英]Python 2 How to debug code injected by the exec block
该项目是pywebsocket ,以standalong模式运行。
从文件中读取处理程序,并通过exec <code-block-in-string> in global_dic
。 然后,将处理程序代码通过global_dic[<function-name>]
挂钩。 当请求URL时,将通过资源处理程序映射调用处理程序功能。
如何跨过exec块中的处理程序中的代码? 具体来说,您如何在PyCharm中做到这一点? 还是其他工具?
或更笼统地说,您如何调试exec块中的代码?
对于特定的代码,通过函数_source_handler_file()
读取处理程序并从mod_pywebsocket/dispatch.py
中mod_pywebsocket/dispatch.py
处理程序,例如(实际上是在调用此函数之前打开并读取的,但在下面将其放在此处以解释逻辑):
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)
触发了相同的代码,它很有效。 它在注入的处理函数上停止。 不知道为什么前几天没用。
如果可以更改/覆盖/ 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下的仅供参考:
code_block = compile(open('other.py').read(), 'other.py', 'exec')
blob = {}
exec(code_block, blob)
print("blob %s" % blob['toto'])
现在,如果在other.py中放置一个断点,pycharm将停止在它上面!
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.