繁体   English   中英

Python 2如何调试exec块注入的代码

[英]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.pymod_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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM