プロジェクトは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の下
awesome!それは私の質問の半分を解決しました。 – minghua
今、すべての私の質問を解決したことが確認されています。 – minghua