Skip to main content

InquirerPrompt

🍴 Community-Maintained Fork

This is a community fork of kazhala/InquirerPy, maintained at tobiashochguertel/InquirerPrompt.

The original project is a fantastic library that we rely on and deeply appreciate. Unfortunately the upstream has been quiet for some time, and the community has accumulated valuable bug fixes, compatibility updates, and feature contributions that have not been reviewed or merged. Rather than letting those improvements go to waste, we decided to maintain this fork so that InquirerPrompt stays healthy and up-to-date for everyone.

Our goal is to contribute all improvements back upstream — if the original author becomes active again we will happily defer to them. Until then, we are keeping the lights on here. 🙏

Item Detail
Upstream kazhala/InquirerPy @ 0.3.4 (last commit Nov 2022)
This fork tobiashochguertel/InquirerPrompt
Install pip install InquirerPrompt (import: import InquirerPrompt)
Docs InquirerPrompt.readthedocs.io

If you are the original author and would like to resume ownership or collaborate, please open an issue — we would love to work together!


CI Coverage Version PyPi Upstream

Documentation: InquirerPrompt.readthedocs.io

Introduction

InquirerPy is a Python port of the famous Inquirer.js (A collection of common interactive command line user interfaces). This project is a re-implementation of the PyInquirer project, with bug fixes of known issues, new prompts, backward compatible APIs as well as more customisation options.

Demo

Motivation

PyInquirer is a great Python port of Inquirer.js, however, the project is slowly reaching to an unmaintained state with various issues left behind and no intention to implement more feature requests. I was heavily relying on this library for other projects but could not proceed due to the limitations.

Some noticeable ones that bother me the most:

  • hard limit on prompt_toolkit version 1.0.3
  • various color issues
  • various cursor issues
  • No options for VI/Emacs navigation key bindings
  • Pagination option doesn't work

This project uses python3.7+ type hinting with focus on resolving above issues while providing greater customisation options.

Requirements

OS

Leveraging prompt_toolkit, InquirerPy works cross platform for all OS. Although Unix platform may have a better experience than Windows.

Python

python >= 3.10

Getting Started

Checkout full documentation here.

Install

pip3 install InquirerPrompt

Quick Start

Classic Syntax (PyInquirer)

from InquirerPrompt import prompt

questions = [
    {"type": "input", "message": "What's your name:", "name": "name"},
    {"type": "confirm", "message": "Confirm?", "name": "confirm"},
]
result = prompt(questions)
name = result["name"]
confirm = result["confirm"]

Alternate Syntax

from InquirerPrompt import inquirer

name = inquirer.text(message="What's your name:").execute()
confirm = inquirer.confirm(message="Confirm?").execute()

Colored Choices

Choice names support prompt_toolkit formatted text objects (HTML, ANSI, FormattedText) for per-choice coloring. This works in all list-type prompts: select, checkbox, rawlist, expand, and fuzzy.

from prompt_toolkit.formatted_text import HTML
from InquirerPrompt import inquirer
from InquirerPrompt.base.control import Choice

result = inquirer.select(
    message="Select a shell:",
    choices=[
        Choice("zsh", name=HTML("<ansibrightcyan>Zsh</ansibrightcyan>  <ansigreen>Search: ✓</ansigreen>  <ansigreen>AI: ✓</ansigreen>")),
        Choice("bash", name=HTML("<ansibrightcyan>Bash</ansibrightcyan>  <ansigreen>Search: ✓</ansigreen>  <ansigreen>AI: ✓</ansigreen>")),
        Choice("fish", name=HTML("<ansibrightcyan>Fish</ansibrightcyan>  <ansired>Search: ✗</ansired>  <ansired>AI: ✗</ansired>")),
    ],
    border=True,
).execute()

ANSI escape codes are also supported via prompt_toolkit.formatted_text.ANSI:

from prompt_toolkit.formatted_text import ANSI

Choice("red", name=ANSI("\033[31m● Red\033[0m"))

Plain string choice names work as before — this feature is fully backward compatible.

See the Style documentation for available color classes and the examples/colored_choices.py demo script.

Rich Renderables

With the optional rich extra, rich_to_ansi renders rich renderables (or strings containing rich markup) into prompt_toolkit formatted text, usable anywhere formatted text is accepted — including choice names:

pip install "InquirerPrompt[rich]"
from rich.text import Text

from InquirerPrompt import inquirer
from InquirerPrompt.base.control import Choice
from InquirerPrompt.utils import rich_to_ansi

result = inquirer.select(
    message="Select a status:",
    choices=[
        Choice("ok", name=rich_to_ansi("[bold green]✓ OK[/bold green]")),
        Choice("warn", name=rich_to_ansi("[bold yellow]⚠ Warning[/bold yellow]")),
        Choice("err", name=rich_to_ansi("[bold red]✗ Error[/bold red]")),
        Choice("zsh", name=rich_to_ansi(Text("zsh", style="bright_cyan"))),
    ],
    border=True,
).execute()

Keep choice names single-line (or pass width) when using rich renderables as choice names.

See the rich renderables documentation and the examples/rich_choices.py demo script.

Preview Prompt

select prompts can display a live preview pane for the highlighted choice. The preview callable receives the choice value and may return a plain string, a prompt_toolkit formatted text object, or a rich renderable (with the InquirerPrompt[rich] extra):

from rich.panel import Panel

from InquirerPrompt import inquirer


def render_preview(value):
    return Panel(f"Details for {value}", border_style="green")


result = inquirer.preview(
    message="Select an option:",
    choices=["one", "two", "three"],
    preview=render_preview,
    preview_height=7,
).execute()

See the preview documentation and the examples/alternate/preview.py demo script.

Open in Editor

text prompts support open_in_editor=True so the user can switch to their default editor with the standard prompt_toolkit shortcuts (C-x C-e in Emacs mode, v in Vi navigation mode). This is especially useful for long, multi-line answers:

from InquirerPrompt import inquirer

result = inquirer.text(
    message="Enter your notes:",
    multiline=True,
    open_in_editor=True,
    tempfile_suffix=".md",
).execute()

Use tempfile_suffix to give the temporary editor file a useful extension (e.g. ".md" or ".py").

Erase When Done

All list-type prompts (select, checkbox, rawlist, expand, fuzzy, number) accept an erase_when_done parameter. When True, the prompt UI is erased from the terminal after the user answers — useful when prompts are used in a loop to avoid ghost lines accumulating.

from InquirerPrompt import inquirer

result = inquirer.select(
    message="Pick one:",
    choices=["a", "b", "c"],
    erase_when_done=True,
).execute()
# Terminal output is clean — no prompt artifacts left behind

Migrating from PyInquirer

Most APIs from PyInquirer should be compatible with InquirerPy. If you have discovered more incompatible APIs, please create an issue or directly update README via a pull request.

EditorPrompt

text prompts support an open_in_editor=True option that opens the user's default editor from within the input prompt. The temporary file is written with the current buffer and $EDITOR/$VISUAL is used to edit it. This covers the common use case of PyInquirer's editor type:

from InquirerPrompt import inquirer

result = inquirer.text(
    message="Enter notes:",
    multiline=True,
    open_in_editor=True,
    tempfile_suffix=".md",
).execute()

CheckboxPrompt

The following table contains the mapping of incompatible parameters.

PyInquirer InquirerPy
pointer_sign pointer
selected_sign enabled_symbol
unselected_sign disabled_symbol

Style

Every style keys from PyInquirer is present in InquirerPy except the ones in the following table.

PyInquirer InquirerPy
selected pointer

Although InquirerPy support all the keys from PyInquirer, the styling works slightly different. Please refer to the Style documentation for detailed information.

Similar projects

questionary

questionary is a fantastic fork which supports prompt_toolkit 3.0.0+ with performance improvement and more customisation options. It's already a well established and stable library.

Comparing with questionary, InquirerPy offers even more customisation options in styles, UI as well as key bindings. InquirerPy also provides a new and powerful fuzzy prompt.

python-inquirer

python-inquirer is another great Python port of Inquirer.js. Instead of using prompt_toolkit, it leverages the library blessed to implement the UI.

Before implementing InquirerPy, this library came up as an alternative. It's a more stable library comparing to the original PyInquirer, however it has a rather limited customisation options and an older UI which did not solve the issues I was facing described in the Motivation section.

Comparing with python-inquirer, InquirerPy offers a slightly better UI, more customisation options in key bindings and styles, providing pagination as well as more prompts.

Credit

This project is based on the great work done by the following projects & their authors.

  • kazhala/InquirerPy — the original InquirerPy library by @kazhala. This fork exists solely because the upstream project has been inactive since 2022. All improvements here are intended to be contributed back upstream if the original author becomes active again. The MIT licence and original copyright are preserved in full.
  • PyInquirer
  • prompt_toolkit

License

This project is licensed under MIT.

Release files for InquirerPrompt 0.6.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for InquirerPrompt 0.6.0
File Size Uploaded
inquirerprompt-0.6.0.tar.gz 266.5 kB Details

Built distribution (wheel)

Table of built distributions (wheels) for InquirerPrompt 0.6.0
File Interpreter ABI Platform
inquirerprompt-0.6.0-py3-none-any.whl Python 3 none any Details

Total release size: 343.6 kB

Release files / inquirerprompt-0.6.0.tar.gz

Download URL inquirerprompt-0.6.0.tar.gz
Size 266.5 kB
Tags Source
SHA-256 checksum
How to use checksums
c7db361f2da53c5204f7e2506b54cc1612e0c74f87d3c9bd8ef2e986977d505a
BLAKE2b-256 checksum
How to use checksums
04a2934368cdc3630db8154d48cd209b40d2be85a2d6a996b923a34e4341c650
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release files / inquirerprompt-0.6.0-py3-none-any.whl

Download URL inquirerprompt-0.6.0-py3-none-any.whl
Size 77.1 kB
Tags Python 3
SHA-256 checksum
How to use checksums
7171323fde6677951e08633b78421d8adb9c5a79b16814c6826085adc8efade0
BLAKE2b-256 checksum
How to use checksums
c58f5967a387a64f125388a9a7685ec83fe7f944cc6af238226021a409c2665a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
No
Uploaded via twine/7.0.0 CPython/3.13.14

Release history Release notifications | RSS feed

This release

0.6.0 This release

2 release files

0.5.0

2 release files

0.4.1

2 release files

0.4.0

2 release files

0.3.4

2 release files

0.3.1

2 release files

0.3.0

2 release files

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page