簡體   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