import os import sys import trio import tractor async def main() -> None: # intially unset, no entry. orig_pybp_var: int = os.environ.get('PYTHONBREAKPOINT') assert orig_pybp_var in {None, "0"} async with tractor.open_nursery( debug_mode=True, ) as an: assert an assert ( (pybp_var := os.environ['PYTHONBREAKPOINT']) == 'tractor.devx._debug._sync_pause_from_builtin' ) # TODO: an assert that verifies the hook has indeed been, hooked # XD assert ( (pybp_hook := sys.breakpointhook) is not tractor.devx._debug._set_trace ) print( f'$PYTHONOBREAKPOINT: {pybp_var!r}\n' f'`sys.breakpointhook`: {pybp_hook!r}\n' ) breakpoint() pass # first bp, tractor hook set. # XXX AFTER EXIT (of actor-runtime) verify the hook is unset.. # # YES, this is weird but it's how stdlib docs say to do it.. # https://docs.python.org/3/library/sys.html#sys.breakpointhook assert os.environ.get('PYTHONBREAKPOINT') is orig_pybp_var assert sys.breakpointhook # now ensure a regular builtin pause still works breakpoint() pass # last bp, stdlib hook restored if __name__ == '__main__': trio.run(main)