Skip to content

patch_stdout sometimes throws exception? #731

Open
@vlovich

Description

@vlovich

Sometimes I get this exception when I enter input.

Traceback (most recent call last):
  File "/opt/homebrew/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/asyncio/events.py", line 88, in _run
    self._context.run(self._callback, *self._args)
  File "prompt_toolkit/eventloop/context.py", line 115, in new_func
    return func(*a, **kw)
  File "prompt_toolkit/patch_stdout.py", line 97, in write_and_flush_in_loop
    run_in_terminal(write_and_flush, in_executor=False)
  File "prompt_toolkit/application/run_in_terminal.py", line 41, in run_in_terminal
    return run_coroutine_in_terminal(async_func, render_cli_done=render_cli_done)
  File "prompt_toolkit/application/run_in_terminal.py", line 62, in run_coroutine_in_terminal
    assert app._is_running
AssertionError

My input processing loop looks like this:

    parser = user_input_parser()
    validator = Validator.from_callable(
      lambda _: PROMPT_STATE.enabled, error_message="Terminal not available")
    while True:
      try:
        with patch_stdout(raw=True):
          user_input = await session.prompt(
            lambda: "> " if PROMPT_STATE.enabled else "", async_=True,
            rprompt=lambda: PROMPT_STATE.status, validator=validator,
            validate_while_typing=True)

        if not PROMPT_STATE.enabled:
          continue
      except KeyboardInterrupt:
        return

      parse_input(user_input.strip())

I'm dumping things to the screen via python logging module but AFAIK I don't have any threads going on. Maybe there's a bug where prompt toolkit is launching threads unnecessarily? It seems like there's a few threads doing sleeps in key_processor which seems weird (wouldn't there only be 1?) but not sure if related or expected behaviour. Is it possible I'm doing something very wrong?

MainThread <_MainThread(MainThread, started 140735655584640)>
  File "shell.py", line 1404, in <module>
    sys.exit(main(sys.argv[1:]) or 0)
  File "shell.py", line 1398, in main
    loop.run_until_complete(prompt_task)
  File "/opt/homebrew/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/asyncio/base_events.py", line 555, in run_until_complete
    self.run_forever()
  File "/opt/homebrew/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/asyncio/base_events.py", line 523, in run_forever
    self._run_once()
  File "/opt/homebrew/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/asyncio/base_events.py", line 1758, in _run_once
    handle._run()
  File "/opt/homebrew/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/asyncio/events.py", line 100, in _run
    self._loop.call_exception_handler(context)
  File "/opt/homebrew/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/asyncio/base_events.py", line 1626, in call_exception_handler
    self._exception_handler(self, context)
  File "shell.py", line 1272, in exception_handler
    file=exception_stderr)

Thread-1 <Thread(Thread-1, started daemon 123145533894656)>
  File "/opt/homebrew/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 885, in _bootstrap
    self._bootstrap_inner()
  File "/opt/homebrew/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 917, in _bootstrap_inner
    self.run()
  File "/opt/homebrew/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 865, in run
    self._target(*self._args, **self._kwargs)
  File "prompt_toolkit/eventloop/utils.py", line 33, in run
    result = self.target()
  File "prompt_toolkit/key_binding/key_processor.py", line 378, in wait
    time.sleep(timeout)

Thread-2 <Thread(Thread-2, started daemon 123145539149824)>
  File "/opt/homebrew/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 885, in _bootstrap
    self._bootstrap_inner()
  File "/opt/homebrew/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 917, in _bootstrap_inner
    self.run()
  File "/opt/homebrew/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 865, in run
    self._target(*self._args, **self._kwargs)
  File "prompt_toolkit/eventloop/utils.py", line 33, in run
    result = self.target()
  File "prompt_toolkit/key_binding/key_processor.py", line 378, in wait
    time.sleep(timeout)

Thread-3 <Thread(Thread-3, started daemon 123145544404992)>
  File "/opt/homebrew/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 885, in _bootstrap
    self._bootstrap_inner()
  File "/opt/homebrew/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 917, in _bootstrap_inner
    self.run()
  File "/opt/homebrew/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 865, in run
    self._target(*self._args, **self._kwargs)
  File "prompt_toolkit/eventloop/utils.py", line 33, in run
    result = self.target()
  File "prompt_toolkit/application/application.py", line 562, in <lambda>
    lambda: auto_flush_input(counter), _daemon=True)
  File "prompt_toolkit/application/application.py", line 567, in auto_flush_input
    time.sleep(self.ttimeoutlen)

Thread-4 <Thread(Thread-4, started daemon 123145549660160)>
  File "/opt/homebrew/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 885, in _bootstrap
    self._bootstrap_inner()
  File "/opt/homebrew/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 917, in _bootstrap_inner
    self.run()
  File "/opt/homebrew/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 865, in run
    self._target(*self._args, **self._kwargs)
  File "prompt_toolkit/eventloop/utils.py", line 33, in run
    result = self.target()
  File "prompt_toolkit/key_binding/key_processor.py", line 378, in wait
    time.sleep(timeout)

Thread-5 <Thread(Thread-5, started daemon 123145554915328)>
  File "/opt/homebrew/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 885, in _bootstrap
    self._bootstrap_inner()
  File "/opt/homebrew/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 917, in _bootstrap_inner
    self.run()
  File "/opt/homebrew/Cellar/python/3.7.0/Frameworks/Python.framework/Versions/3.7/lib/python3.7/threading.py", line 865, in run
    self._target(*self._args, **self._kwargs)
  File "prompt_toolkit/eventloop/utils.py", line 33, in run
    result = self.target()
  File "prompt_toolkit/application/application.py", line 562, in <lambda>
    lambda: auto_flush_input(counter), _daemon=True)
  File "prompt_toolkit/application/application.py", line 567, in auto_flush_input
    time.sleep(self.ttimeoutlen)

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions