次のようにして、ある程度自分でロールバックできます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 を使用している場合は、試してみてください。