prompt-toolkit / python-prompt-toolkit

Library for building powerful interactive command line applications in Python
https://python-prompt-toolkit.readthedocs.io/
BSD 3-Clause "New" or "Revised" License
9.11k stars 717 forks source link

Read from sys.stdin and then use prompt_toolkit #1143

Open anki-code opened 4 years ago

anki-code commented 4 years ago

Hello! Thank you for prompt_toolkit it's awesome!

Is there a way to read the data from stdin and then open prompt?

Example:

import sys
import pandas as pd
from prompt_toolkit import PromptSession

df = pd.read_json(sys.stdin, lines=True)
print(df)

session = PromptSession()
query = session.prompt('> ')

Expected result:

$ echo '{"a":1}' | python example.py                                                                                                                                                    
   a
0  1
> 

What I've got in prompt_toolkit 3.0.5:

$ echo '{"a":1}' | python example.py 
   a
0  1
Warning: Input is not a terminal (fd=0).
>                                                                                                                                                                                   
Traceback (most recent call last):
  File "example.py", line 11, in <module>
    query = session.prompt('> ')
  File "/opt/miniconda/lib/python3.8/site-packages/prompt_toolkit/shortcuts/prompt.py", line 994, in prompt
    return self.app.run(set_exception_handler=set_exception_handler)
  File "/opt/miniconda/lib/python3.8/site-packages/prompt_toolkit/application/application.py", line 811, in run
    return loop.run_until_complete(
  File "/opt/miniconda/lib/python3.8/asyncio/base_events.py", line 616, in run_until_complete
    return future.result()
  File "/opt/miniconda/lib/python3.8/site-packages/prompt_toolkit/application/application.py", line 778, in run_async
    return await _run_async2()
  File "/opt/miniconda/lib/python3.8/site-packages/prompt_toolkit/application/application.py", line 760, in _run_async2
    result = await _run_async()
  File "/opt/miniconda/lib/python3.8/site-packages/prompt_toolkit/application/application.py", line 696, in _run_async
    result = await f
EOFError

There is a workaround to renew stdin with sys.stdin = open("/dev/tty"). In this case I get:

$ echo '{"a":1}' | python example.py 
   a
0  1
Traceback (most recent call last):
  File "example.py", line 12, in <module>
    query = session.prompt('> ')
  File "/opt/miniconda/lib/python3.8/site-packages/prompt_toolkit/shortcuts/prompt.py", line 994, in prompt
    return self.app.run(set_exception_handler=set_exception_handler)
  File "/opt/miniconda/lib/python3.8/site-packages/prompt_toolkit/application/application.py", line 811, in run
    return loop.run_until_complete(
  File "/opt/miniconda/lib/python3.8/asyncio/base_events.py", line 616, in run_until_complete
    return future.result()
  File "/opt/miniconda/lib/python3.8/site-packages/prompt_toolkit/application/application.py", line 778, in run_async
    return await _run_async2()
  File "/opt/miniconda/lib/python3.8/site-packages/prompt_toolkit/application/application.py", line 760, in _run_async2
    result = await _run_async()
  File "/opt/miniconda/lib/python3.8/site-packages/prompt_toolkit/application/application.py", line 682, in _run_async
    with self.input.raw_mode():
  File "/opt/miniconda/lib/python3.8/site-packages/prompt_toolkit/input/vt100.py", line 262, in __enter__
    os.write(self.fileno, b"\x1b[?1l")
OSError: [Errno 9] Bad file descriptor

Thanks!

anki-code commented 3 years ago

@jonathanslenders is this possible?