项目为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)
解决了相同的代码,它只是起作用了。它停止在注入的处理函数上。不知道为什么它前几天没用。
答案 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会停在它上面!