10

メインプログラムを一時停止せずにプログラムの実行中にインタラクティブなpythonコンソール(できればiPython)を生成し、プログラム変数をチェックおよび変更できる方法はありますか? ブラウザーが JavaScript に提供するものに似たもの。

pdb.set_trace()とについては知ってIPython.embed()いますが、どちらもプログラムの実行を一時停止し、プログラムのソースコードのどこかに配置する必要があります。

これは、Python でのデスクトップ ゲーム開発に非常に役立ちます。

4

2 に答える 2

4

次のようにして、ある程度自分でロールバックできますthreading

#!/usr/bin/python3

def _spawn_background_interpreter(*args,**kwargs):
    from threading import Thread
    def _open_interp(locs):
        import code
        code.interact(local=locs)
    locs = args[0] if args else None
    t = Thread(target=_open_interp, args=(locs,))
    t.setDaemon(True) #pre-3.3 API
    t.start()

で呼び出し_spawn_background_interpreter(locals())ます。

私はそれをテストしていませんが、あなたのプログラムが継続的にコンソールに何かを出力しないのであれば、おそらくこれで問題ないでしょう。

「新しいコンソールを開く」というアイデアは興味深いものですが、非常に環境固有であるため、ここでは取り組みません。事前にパッケージ化されたより良いソリューションがあれば、興味があります。

編集:解決策の試みmultiprocessing

def _spawn_background_interpreter(*args,**kwargs):
    from multiprocessing import Process
    import sys, os
    def _open_interp(locs,stdin):
        import code
        sys.stdin = os.fdopen(stdin)
        code.interact(local=locs)
    locs = args[0] if args else None
    fileno = sys.stdin.fileno()
    p = Process(target=_open_interp, args=(locs,fileno))
    p.daemon = True
    p.start()

私が最初に避けた理由multiprocessingは、新しいプロセスがそれぞれ独自の PID (および標準入力) を取得するためです。したがって、メイン スレッドの stdin を子プロセスに渡す必要があり、そこから少しハッキングされます。 Python 3.2 以前にはバグがあり、プロセスを呼び出すたびにトレースバックが発生することに注意してください。これは 3.3 で修正されています。exit()multiprocessing

残念ながら、multiprocessingコードは POSIX 準拠のシステムでのみ実行されます。つまり、Windows では実行されません。乗り越えられないわけではなく、パイプを含むより複雑なソリューションが必要になるだけです。

とにかく、multiprocessingメイン スレッドで 100% の CPU 使用率に近づいている場合、実装のパフォーマンスが向上する可能性があります。*nix を使用している場合は、試してみてください。

于 2013-11-03T20:44:25.860 に答える
1

Eclipse で実行される PyDev に精通していると思います。メインプログラムを中断する準備ができている場合 (これは望ましくありません)、これは優れたデバッグ機能を提供します。ただし、PyDev には、実行中の既存のプログラムにアタッチできるデバッグ サーバーの実行という機能があります。私自身は試したことはありませんが、PyDev は Eclipse の優れたプラグインであるため、確認することをお勧めします。試してみたら、あなたの考えに興味があります。見てみてください:

http://pydev.org/manual_adv_remote_debugger.html

詳細については。幸運を。

于 2013-11-03T19:59:49.577 に答える