2016-05-11 2 views
0

プロジェクトはpywebsocketで、スタンドアロンモードで実行されています。Python 2 execブロックによって注入されたコードをデバッグする方法

ハンドラはファイルから読み込まれ、exec <code-block-in-string> in global_dicで実行されます。ハンドラコードはglobal_dic[<function-name>]にフックされます。 URLが要求されると、ハンドラ関数はリソースハンドラマップを介して呼び出されます。

execブロック内のハンドラ内のコードをどのように踏み越えることができますか?具体的にPyCharmでどのようにしますか?または他のツールですか?

より一般的には、execブロックでどのようにコードをデバッグしますか?特定のコードの場合

、ハンドラが(実際にはオープンと読み取りは、この関数を呼び出す前ですが、ただのロジックを説明するために、以下のそれをここに置く)に読み込まれ、機能_source_handler_file()によって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の例に基づいて、次のようになります。PY2の下

print(3) 
toto = 5 
def my_handler_func(): 
    print(88) 

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)? 
コードは上のPyCharmで停止する

execfile()を実行します。

しかし、注入されたハンドラmyhandler()を呼び出すと、注入されたコードブロック内でprint(88)を停止したいと思います。これはまだ解決されていません。

質問の後半を解決するには、コードをPythonシステムのインポートされたモジュールレコードにプルすることをお勧めします。おそらく__import__を使用します。しかし、それは名前空間を汚染するでしょう。より良い方法がありますか?またはインポートする方法がありますが、名前空間を分離したままにしておきますか?再び

更新:

今日は私はそれは単に働いexecfile("...", blob)と同じコードを解雇しました。注入されたハンドラ関数で停止しました。先日、なぜそれがうまくいかなかったのか分かりません。 Pythonの3の下

答えて

3

あなたが/オーバーライド/モンキーパッチのdispatch.py​​を変更することができる場合、あなたは(execfileをを使用することができます)またはEXEC()...(コンパイル):

あなたがother.pyファイルがある場合PY2の下

print(1) 
print(2) 
print(3) 
toto = 5 

:PY3下だけFYI

execfile('other.py', blob) 
print("blob %s" % blob['toto']) 

code_block = compile(open('other.py').read(), 'other.py', 'exec') 
blob = {} 
exec(code_block, blob) 
print("blob %s" % blob['toto']) 

他のブレークポイントにブレークポイントを設定した場合。py、pycharmが停止します!

+0

awesome!それは私の質問の半分を解決しました。 – minghua

+1

今、すべての私の質問を解決したことが確認されています。 – minghua

関連する問題