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