stty


Namestty JSON
Version 0.0.2 PyPI version JSON
download
home_pageNone
SummaryA Python library for manipulating terminal settings in the style of POSIX stty(1).
upload_time2025-08-25 03:30:03
maintainerNone
docs_urlNone
authorNone
requires_python>=3.9
license# Copyright (C) 2025 Soumendra Ganguly # This program is free software: you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation, either version 3 of the License, or # (at your option) any later version. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # You should have received a copy of the GNU General Public License # along with this program. If not, see <https://www.gnu.org/licenses/>.
keywords terminal tty stty termios winsize posix terminal-settings pseudo-terminal pty terminal-attributes
VCS
bugtrack_url
requirements No requirements were recorded.
Travis-CI No Travis.
coveralls test coverage No coveralls.
            # stty.py

A Python library for manipulating terminal settings in the style of POSIX `stty(1)`.

---

## Overview

`stty` provides a high-level, Pythonic interface to terminal I/O settings, including control characters, baud rates, and window size, using the `termios` and related modules. It allows you to get, set, save, and restore terminal attributes, and to apply them to file descriptors or pseudo-terminals.

---

## Features

- Read and modify terminal attributes (iflag, oflag, cflag, lflag, control characters, speeds, window size)
- Save and load settings to/from JSON files
- Apply settings to file descriptors or pseudo-terminals
- Symbolic and string-based access to all settings
- Emulates many `stty(1)` features and modes (e.g., raw, evenp, oddp, nl, ek)
- Cross-platform support (where `termios` is available)

---

## Installation

This is a pure Python library. Place `stty.py` in your project or install via your preferred method.

---

## Examples

### 1. Reading and Printing Terminal Settings

```python
from stty import Stty

# Open terminal and get current settings from stdin (fd=0)
tty = Stty(fd=0)
print(tty)  # Print all settings in a compact form
```

---

### 2. Setting Individual Attributes

```python
from stty import Stty

tty = Stty(fd=0)

# Turn off echo
tty.echo = False

# Set erase character to Ctrl-H
tty.erase = "^H"

# Set input baud rate to 9600
tty.ispeed = 9600

# Set number of rows in the terminal window (if supported)
tty.rows = 40
```

---

### 3. Setting Multiple Attributes at Once

```python
from stty import Stty

tty = Stty(fd=0)

# Set several attributes in one call
tty.set(
    echo=False,
    icanon=False,
    erase="^H",
    ispeed=19200,
    ospeed=19200,
    rows=30,
    cols=100
)
```

---

### 4. Saving and Loading Settings

```python
from stty import Stty

tty = Stty(fd=0)

# Save current settings to a file
tty.save("my_tty_settings.json")

# Later, restore settings from the file
tty2 = Stty(path="my_tty_settings.json")
tty2.tofd(0)  # Apply to stdin
```

---

### 5. Using Raw Mode

```python
from stty import Stty

tty = Stty(fd=0)
tty.raw()         # Set raw mode
tty.tofd(0)       # Apply to stdin
```

---

### 6. Working with Pseudo-terminals

```python
from stty import Stty

tty = Stty(fd=0)
m, s, sname = tty.openpty()  # Open a new pty pair and apply settings to slave
print(f"Master fd: {m}, Slave fd: {s}, Slave name: {sname}")
```

---

### 7. Setting Control Characters

```python
from stty import Stty

tty = Stty(fd=0)

# Set interrupt character to Ctrl-C
tty.intr = "^C"

# Set end-of-file character to Ctrl-D
tty.eof = "^D"

# Set suspend character to DEL
tty.susp = "^?"
```

---

### 8. Querying Settings as a Dictionary

```python
from stty import Stty

tty = Stty(fd=0)
settings = tty.get()
print(settings["echo"])   # True or False
print(settings["erase"])  # e.g., '^H'
```

---

### 9. Using Symbolic Constants

```python
from stty import Stty, cs8, tab0

tty = Stty(fd=0)

# Set character size to 8 bits using symbolic constant
tty.csize = cs8

# Set tab delay to tab0
tty.tabdly = tab0
```

---

### 10. Fork new process with pseudo-terminal

```python
x = stty.Stty(0)
x.intr = "^p"
pid, m, sname  = x.forkpty()

if pid == 0: # Child process
    with open("out", "w") as f:
        f.write(str(stty.Stty(0)))
else: # Parent process
    print(sname)
    print("")
    s = os.open(sname, os.O_RDWR)
    print("Parent:", stty.Stty(s))
    os.close(s)
```

---

## API Reference

### Classes

#### `Stty`

Manipulate terminal settings in the style of `stty(1)`.

**Constructor:**
```python
Stty(fd: int = None, path: str = None, **opts)
```
- `fd`: File descriptor to read settings from.
- `path`: Path to JSON file to load settings from.
- `**opts`: Any supported terminal attribute as a keyword argument.

**Methods:**

- `get() -> dict`
  Return a dictionary of all current settings.

- `set(**opts)`
  Set multiple attributes at once.

- `save(path: str = None)`
  Save settings to a JSON file, or return a deep copy if no path is given.

- `load(path: str)`
  Load settings from a JSON file.

- `fromfd(fd: int)`
  Load settings from a file descriptor.

- `tofd(fd: int, when=TCSANOW, apply_termios=True, apply_winsize=True)`
  Apply settings to a file descriptor.

- `evenp(plus=True)`
  Set/unset even parity mode.

- `oddp(plus=True)`
  Set/unset odd parity mode.

- `raw()`
  Set terminal to raw mode.

- `nl(plus=True)`
  Set/unset nl combination mode.

- `ek()`
  Set ek combination mode.

- `openpty(apply_termios=True, apply_winsize=True)`
  Open a new pseudo-terminal pair and apply settings.

- `forkpty(apply_termios=True, apply_winsize=True)`
  Fork a new process with a pseudo-terminal and apply settings.

**Attribute Access:**

- All terminal attributes (e.g., `echo`, `icanon`, `erase`, `ispeed`, `rows`, etc.) are accessible as properties.
- Setting an attribute updates the internal state and validates the value.

---

### Constants

- `TCSANOW`, `TCSADRAIN`, `TCSAFLUSH`: the values accepted by the `when` named argument of `Stty.tofd()`. Compare with `termios.tcsetattr()`.
- Symbolic constants for masks and values (e.g., `cs8`, `tab0`, etc.) are available as module attributes.

---

### Data

- `settings`: A dictionary describing all available Stty attributes and their possible values on the current platform.

---

### Functions

- `settings_help_str`: Return help string about all available Stty attributes and their possible values on the current platform.
- `settings_help`: Print help message about all available Stty attributes and their possible values on the current platform.

---

## Compatibility

- Requires Python 3.x and a POSIX-like system with the `termios` module.
- Some features depend on platform support (e.g., window size).

---

## License

This program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.

---

## Author

Soumendra Ganguly, 2025

---

## See Also

- [stty(1) manpage](https://man7.org/linux/man-pages/man1/stty.1.html)
- [Python termios documentation](https://docs.python.org/3/library/termios.html)

            

Raw data

            {
    "_id": null,
    "home_page": null,
    "name": "stty",
    "maintainer": null,
    "docs_url": null,
    "requires_python": ">=3.9",
    "maintainer_email": "Soumendra Ganguly <soumendraganguly@gmail.com>",
    "keywords": "terminal, tty, stty, termios, winsize, posix, terminal-settings, pseudo-terminal, pty, terminal-attributes",
    "author": null,
    "author_email": "Soumendra Ganguly <soumendraganguly@gmail.com>",
    "download_url": "https://files.pythonhosted.org/packages/e3/2c/32fe1f9a23763985e4e796fcf3e6f72cf669d1443cfb16fa653ea5fe4e38/stty-0.0.2.tar.gz",
    "platform": null,
    "description": "# stty.py\n\nA Python library for manipulating terminal settings in the style of POSIX `stty(1)`.\n\n---\n\n## Overview\n\n`stty` provides a high-level, Pythonic interface to terminal I/O settings, including control characters, baud rates, and window size, using the `termios` and related modules. It allows you to get, set, save, and restore terminal attributes, and to apply them to file descriptors or pseudo-terminals.\n\n---\n\n## Features\n\n- Read and modify terminal attributes (iflag, oflag, cflag, lflag, control characters, speeds, window size)\n- Save and load settings to/from JSON files\n- Apply settings to file descriptors or pseudo-terminals\n- Symbolic and string-based access to all settings\n- Emulates many `stty(1)` features and modes (e.g., raw, evenp, oddp, nl, ek)\n- Cross-platform support (where `termios` is available)\n\n---\n\n## Installation\n\nThis is a pure Python library. Place `stty.py` in your project or install via your preferred method.\n\n---\n\n## Examples\n\n### 1. Reading and Printing Terminal Settings\n\n```python\nfrom stty import Stty\n\n# Open terminal and get current settings from stdin (fd=0)\ntty = Stty(fd=0)\nprint(tty)  # Print all settings in a compact form\n```\n\n---\n\n### 2. Setting Individual Attributes\n\n```python\nfrom stty import Stty\n\ntty = Stty(fd=0)\n\n# Turn off echo\ntty.echo = False\n\n# Set erase character to Ctrl-H\ntty.erase = \"^H\"\n\n# Set input baud rate to 9600\ntty.ispeed = 9600\n\n# Set number of rows in the terminal window (if supported)\ntty.rows = 40\n```\n\n---\n\n### 3. Setting Multiple Attributes at Once\n\n```python\nfrom stty import Stty\n\ntty = Stty(fd=0)\n\n# Set several attributes in one call\ntty.set(\n    echo=False,\n    icanon=False,\n    erase=\"^H\",\n    ispeed=19200,\n    ospeed=19200,\n    rows=30,\n    cols=100\n)\n```\n\n---\n\n### 4. Saving and Loading Settings\n\n```python\nfrom stty import Stty\n\ntty = Stty(fd=0)\n\n# Save current settings to a file\ntty.save(\"my_tty_settings.json\")\n\n# Later, restore settings from the file\ntty2 = Stty(path=\"my_tty_settings.json\")\ntty2.tofd(0)  # Apply to stdin\n```\n\n---\n\n### 5. Using Raw Mode\n\n```python\nfrom stty import Stty\n\ntty = Stty(fd=0)\ntty.raw()         # Set raw mode\ntty.tofd(0)       # Apply to stdin\n```\n\n---\n\n### 6. Working with Pseudo-terminals\n\n```python\nfrom stty import Stty\n\ntty = Stty(fd=0)\nm, s, sname = tty.openpty()  # Open a new pty pair and apply settings to slave\nprint(f\"Master fd: {m}, Slave fd: {s}, Slave name: {sname}\")\n```\n\n---\n\n### 7. Setting Control Characters\n\n```python\nfrom stty import Stty\n\ntty = Stty(fd=0)\n\n# Set interrupt character to Ctrl-C\ntty.intr = \"^C\"\n\n# Set end-of-file character to Ctrl-D\ntty.eof = \"^D\"\n\n# Set suspend character to DEL\ntty.susp = \"^?\"\n```\n\n---\n\n### 8. Querying Settings as a Dictionary\n\n```python\nfrom stty import Stty\n\ntty = Stty(fd=0)\nsettings = tty.get()\nprint(settings[\"echo\"])   # True or False\nprint(settings[\"erase\"])  # e.g., '^H'\n```\n\n---\n\n### 9. Using Symbolic Constants\n\n```python\nfrom stty import Stty, cs8, tab0\n\ntty = Stty(fd=0)\n\n# Set character size to 8 bits using symbolic constant\ntty.csize = cs8\n\n# Set tab delay to tab0\ntty.tabdly = tab0\n```\n\n---\n\n### 10. Fork new process with pseudo-terminal\n\n```python\nx = stty.Stty(0)\nx.intr = \"^p\"\npid, m, sname  = x.forkpty()\n\nif pid == 0: # Child process\n    with open(\"out\", \"w\") as f:\n        f.write(str(stty.Stty(0)))\nelse: # Parent process\n    print(sname)\n    print(\"\")\n    s = os.open(sname, os.O_RDWR)\n    print(\"Parent:\", stty.Stty(s))\n    os.close(s)\n```\n\n---\n\n## API Reference\n\n### Classes\n\n#### `Stty`\n\nManipulate terminal settings in the style of `stty(1)`.\n\n**Constructor:**\n```python\nStty(fd: int = None, path: str = None, **opts)\n```\n- `fd`: File descriptor to read settings from.\n- `path`: Path to JSON file to load settings from.\n- `**opts`: Any supported terminal attribute as a keyword argument.\n\n**Methods:**\n\n- `get() -> dict`\n  Return a dictionary of all current settings.\n\n- `set(**opts)`\n  Set multiple attributes at once.\n\n- `save(path: str = None)`\n  Save settings to a JSON file, or return a deep copy if no path is given.\n\n- `load(path: str)`\n  Load settings from a JSON file.\n\n- `fromfd(fd: int)`\n  Load settings from a file descriptor.\n\n- `tofd(fd: int, when=TCSANOW, apply_termios=True, apply_winsize=True)`\n  Apply settings to a file descriptor.\n\n- `evenp(plus=True)`\n  Set/unset even parity mode.\n\n- `oddp(plus=True)`\n  Set/unset odd parity mode.\n\n- `raw()`\n  Set terminal to raw mode.\n\n- `nl(plus=True)`\n  Set/unset nl combination mode.\n\n- `ek()`\n  Set ek combination mode.\n\n- `openpty(apply_termios=True, apply_winsize=True)`\n  Open a new pseudo-terminal pair and apply settings.\n\n- `forkpty(apply_termios=True, apply_winsize=True)`\n  Fork a new process with a pseudo-terminal and apply settings.\n\n**Attribute Access:**\n\n- All terminal attributes (e.g., `echo`, `icanon`, `erase`, `ispeed`, `rows`, etc.) are accessible as properties.\n- Setting an attribute updates the internal state and validates the value.\n\n---\n\n### Constants\n\n- `TCSANOW`, `TCSADRAIN`, `TCSAFLUSH`: the values accepted by the `when` named argument of `Stty.tofd()`. Compare with `termios.tcsetattr()`.\n- Symbolic constants for masks and values (e.g., `cs8`, `tab0`, etc.) are available as module attributes.\n\n---\n\n### Data\n\n- `settings`: A dictionary describing all available Stty attributes and their possible values on the current platform.\n\n---\n\n### Functions\n\n- `settings_help_str`: Return help string about all available Stty attributes and their possible values on the current platform.\n- `settings_help`: Print help message about all available Stty attributes and their possible values on the current platform.\n\n---\n\n## Compatibility\n\n- Requires Python 3.x and a POSIX-like system with the `termios` module.\n- Some features depend on platform support (e.g., window size).\n\n---\n\n## License\n\nThis program is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.\n\n---\n\n## Author\n\nSoumendra Ganguly, 2025\n\n---\n\n## See Also\n\n- [stty(1) manpage](https://man7.org/linux/man-pages/man1/stty.1.html)\n- [Python termios documentation](https://docs.python.org/3/library/termios.html)\n",
    "bugtrack_url": null,
    "license": "# Copyright (C) 2025 Soumendra Ganguly\n        \n        # This program is free software: you can redistribute it and/or modify\n        # it under the terms of the GNU General Public License as published by\n        # the Free Software Foundation, either version 3 of the License, or\n        # (at your option) any later version.\n        \n        # This program is distributed in the hope that it will be useful,\n        # but WITHOUT ANY WARRANTY; without even the implied warranty of\n        # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the\n        # GNU General Public License for more details.\n        \n        # You should have received a copy of the GNU General Public License\n        # along with this program.  If not, see <https://www.gnu.org/licenses/>.",
    "summary": "A Python library for manipulating terminal settings in the style of POSIX stty(1).",
    "version": "0.0.2",
    "project_urls": {
        "Homepage": "https://github.com/8vasu/stty.py",
        "Issues": "https://github.com/8vasu/stty.py/issues"
    },
    "split_keywords": [
        "terminal",
        " tty",
        " stty",
        " termios",
        " winsize",
        " posix",
        " terminal-settings",
        " pseudo-terminal",
        " pty",
        " terminal-attributes"
    ],
    "urls": [
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "5ac530357a7ffb24721f4123d01f8a9cbfa400ca557f50427d06411fc22349d3",
                "md5": "0ec7e180ef13849d80bb62403b470b6e",
                "sha256": "45e0e76dc85350f9e1cb9a04cd06d494e87abd5604b2eb20bc63601b740310fb"
            },
            "downloads": -1,
            "filename": "stty-0.0.2-py3-none-any.whl",
            "has_sig": false,
            "md5_digest": "0ec7e180ef13849d80bb62403b470b6e",
            "packagetype": "bdist_wheel",
            "python_version": "py3",
            "requires_python": ">=3.9",
            "size": 14173,
            "upload_time": "2025-08-25T03:30:02",
            "upload_time_iso_8601": "2025-08-25T03:30:02.958839Z",
            "url": "https://files.pythonhosted.org/packages/5a/c5/30357a7ffb24721f4123d01f8a9cbfa400ca557f50427d06411fc22349d3/stty-0.0.2-py3-none-any.whl",
            "yanked": false,
            "yanked_reason": null
        },
        {
            "comment_text": null,
            "digests": {
                "blake2b_256": "e32c32fe1f9a23763985e4e796fcf3e6f72cf669d1443cfb16fa653ea5fe4e38",
                "md5": "be012f286c72af5094554198e4632a01",
                "sha256": "3163e13c2a034c7c09f0dc318994c0dc52c2cfcbefdd6632eace41713d81e0ac"
            },
            "downloads": -1,
            "filename": "stty-0.0.2.tar.gz",
            "has_sig": false,
            "md5_digest": "be012f286c72af5094554198e4632a01",
            "packagetype": "sdist",
            "python_version": "source",
            "requires_python": ">=3.9",
            "size": 12427,
            "upload_time": "2025-08-25T03:30:03",
            "upload_time_iso_8601": "2025-08-25T03:30:03.956871Z",
            "url": "https://files.pythonhosted.org/packages/e3/2c/32fe1f9a23763985e4e796fcf3e6f72cf669d1443cfb16fa653ea5fe4e38/stty-0.0.2.tar.gz",
            "yanked": false,
            "yanked_reason": null
        }
    ],
    "upload_time": "2025-08-25 03:30:03",
    "github": true,
    "gitlab": false,
    "bitbucket": false,
    "codeberg": false,
    "github_user": "8vasu",
    "github_project": "stty.py",
    "travis_ci": false,
    "coveralls": false,
    "github_actions": true,
    "lcname": "stty"
}
        
Elapsed time: 0.90740s