A modern cmd library based on prompt_toolkit
Project description
ptcmd
A modern interactive command-line application building library based on prompt_toolkit
Language: English/中文
1. Features
- 🚀 Built on
prompt_toolkitfor powerful interactive experiences - 📝 Automatic parameter parsing and completion
- 🌈 Rich text output support (using
richlibrary) - ⚡ Native async command support
- 🔍 Built-in command completion and shortcut keys
2. Installation
Install from PyPI:
pip install ptcmd
Or install from source:
git clone https://github.com/Visecy/ptcmd.git
cd ptcmd
make install
3. Quick Start
Create a simple command-line application:
import sys
from ptcmd import Cmd
class MyApp(Cmd):
def do_hello(self, argv: list[str]) -> None:
"""Hello World!"""
if argv:
name = argv[0]
else:
name = "World"
self.poutput(f"Hello, {name}!")
if __name__ == "__main__":
sys.exit(MyApp().cmdloop())
In this basic example:
- We create a
MyAppclass inheriting fromCmd - Define a
do_hellocommand method - The command accepts an optional name parameter
- Uses "World" if no parameter is provided
- Output greeting using
self.poutput() - Start the CLI with
cmdloop()
This example demonstrates:
- Command definition syntax
- Parameter handling
- Output display
- Application startup process
Run the program and try the hello command:
(Cmd) hello
Hello, World!
(Cmd) hello Alice
Hello, Alice!
4. Advanced Features
4.1 Auto Argument Parsing
For complex commands, use the auto_argument decorator with type hints for automatic argument parsing:
from ptcmd import Cmd, Arg, auto_argument
class MathApp(Cmd):
@auto_argument
def do_add(
self,
x: float,
y: float,
*,
verbose: Arg[bool, "-v", "--verbose"] = False
) -> None:
"""Add two numbers"""
result = x + y
if verbose:
self.poutput(f"{x} + {y} = {result}")
else:
self.poutput(result)
This approach automatically generates equivalent argparse code:
- Converts positional parameters to required arguments
- Converts keyword parameters to optional flags
- Handles type conversion and validation
4.2 Rich Text Output
Leverage rich library for styled output:
class RichApp(Cmd):
def do_hello(self, argv: list[str]) -> None:
self.poutput(f"[bold blue]Hello, World![/bold blue]")
For advanced formatting, access the console directly:
class RichApp(Cmd):
def do_hello(self, argv: list[str]) -> None:
with self.console.pager(styles=True):
self.console.print("Hello, World!", style="bold blue")
4.3 Subcommand Support
For command functions that use the automatic parameter parsing feature, ptcmd allows you to add any number of sub-commands to them in a simple way. The execution order of command functions is starting from the root command and then executing them one by one.
- Single-level subcommand example:
from ptcmd import Cmd, auto_argument
class App(Cmd):
@auto_argument
def do_math(self):
"""Math operations"""
@do_math.add_subcommand("add")
def add(self, x: float, y: float):
"""Addition"""
self.poutput(f"{x} + {y} = {x + y}")
Usage examples:
(Cmd) math add 5 3
5.0 + 3.0 = 8.0
(Cmd) math sub 5 3
5.0 - 3.0 = 2.0
- Multi-level subcommand example:
from ptcmd import Cmd, auto_argument
class App(Cmd):
@auto_argument
def do_server(self):
"""Server management"""
@do_server.add_subcommand("db")
def db(self):
"""Database management"""
@db.add_subcommand("migrate")
def migrate(self, version: str):
"""Execute database migration"""
self.poutput(f"Migrating to version {version}...")
@do_server.add_subcommand("cache")
def cache(self):
"""Cache management"""
@cache.add_subcommand("clear")
def clear(self, confirm: bool = False):
"""Clear cache"""
if confirm:
self.poutput("Cache cleared")
else:
self.poutput("Please add --confirm to proceed")
Usage examples:
(Cmd) server db migrate v1.2.0
Migrating to version v1.2.0...
(Cmd) server cache clear --confirm
Cache cleared
4.4 Async Command Support
Native async/await support for I/O bound operations:
import aiohttp
from ptcmd import Cmd, auto_argument
class AsyncApp(Cmd):
@auto_argument
async def do_get(self, url: str):
"""Fetch URL content"""
async with aiohttp.ClientSession() as session:
async with session.get(url) as resp:
self.poutput(await resp.text(), markup=False)
5. Library Comparison
The following table compares the advantages and disadvantages of three libraries: cmd (standard library), cmd2, and ptcmd:
| Feature | cmd | cmd2 | ptcmd |
|---|---|---|---|
| Feature Richness | Basic | Most Feature-Rich | Moderately Feature-Rich |
| Learning Curve | Simple | Medium | Medium |
| Interactive Experience | Basic | Good | Excellent (based on prompt_toolkit) |
| Auto Completion | None | Supported | Supported |
| Argument Parsing | Manual Handling | Requires building ArgumentParser |
Auto Parsing |
| Async Support | None | None | Native Support |
| Rich Text Output | None | Uses cmd2.ansi module |
Uses rich library |
| Dependencies | None | More | Most |
| Performance | High | Medium | Medium |
| Use Case | Simple CLI | Complex CLI | Modern CLI |
Key Advantages:
- cmd: Python standard library, no dependencies, suitable for simple CLI applications
- cmd2: Comprehensive features, good community support, compatible with
cmd, suitable for traditional CLIs requiring rich features - ptcmd: Provides the best interactive experience, native async support, suitable for modern CLI applications
6. Related Projects
- prompt_toolkit - Foundation for building powerful interactive command lines
- rich - Enables rich text formatting and beautiful output
- typer - Modern CLI framework with type hints
- cmd2 - Inspiration for many ptcmd features
- argparse - Python's standard argument parsing library
- cmd - Python's standard line-oriented command interpreters library
7. Special Thanks
- cmd2 for inspiring the command completion system
- Cline for assisting with project documentation and test cases
8 License
Apache License 2.0 - See LICENSE
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file ptcmd-0.1.3.tar.gz.
File metadata
- Download URL: ptcmd-0.1.3.tar.gz
- Upload date:
- Size: 71.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
975388db49a718715f62df0c505e833e28a65bb76d746eb15039d928fe1fcfd1
|
|
| MD5 |
a0d9c991ba263a3f7d28e41b4e97932b
|
|
| BLAKE2b-256 |
89876951513f881c661bd623e82f8aa8478036b3a7a08db8821566419dd75587
|
Provenance
The following attestation bundles were made for ptcmd-0.1.3.tar.gz:
Publisher:
python-publish.yml on Visecy/ptcmd
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ptcmd-0.1.3.tar.gz -
Subject digest:
975388db49a718715f62df0c505e833e28a65bb76d746eb15039d928fe1fcfd1 - Sigstore transparency entry: 255466601
- Sigstore integration time:
-
Permalink:
Visecy/ptcmd@90073bb9c3a3907f305b62aa746cbcf319b365c5 -
Branch / Tag:
refs/tags/v0.1.3 - Owner: https://github.com/Visecy
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@90073bb9c3a3907f305b62aa746cbcf319b365c5 -
Trigger Event:
release
-
Statement type:
File details
Details for the file ptcmd-0.1.3-py3-none-any.whl.
File metadata
- Download URL: ptcmd-0.1.3-py3-none-any.whl
- Upload date:
- Size: 30.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.12.9
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
f1b52e31ce846c2b91b3040893566e9ee50ab090834ef1baf182b397ce5f4381
|
|
| MD5 |
35ecd9afe80367067bb2c493437c14f2
|
|
| BLAKE2b-256 |
a55beae4907a712978df42b60bc4a44c81e7058f2c9739ea0c4b137c5bc3ea77
|
Provenance
The following attestation bundles were made for ptcmd-0.1.3-py3-none-any.whl:
Publisher:
python-publish.yml on Visecy/ptcmd
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
ptcmd-0.1.3-py3-none-any.whl -
Subject digest:
f1b52e31ce846c2b91b3040893566e9ee50ab090834ef1baf182b397ce5f4381 - Sigstore transparency entry: 255466605
- Sigstore integration time:
-
Permalink:
Visecy/ptcmd@90073bb9c3a3907f305b62aa746cbcf319b365c5 -
Branch / Tag:
refs/tags/v0.1.3 - Owner: https://github.com/Visecy
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
python-publish.yml@90073bb9c3a3907f305b62aa746cbcf319b365c5 -
Trigger Event:
release
-
Statement type: