Context managers¶

When you create tmux objects through libtmux, they normally live until you explicitly kill them. A context manager hands that cleanup back to Python: you scope an object to a block, and libtmux kills the underlying tmux object the moment you leave it — whether you exit cleanly or an exception unwinds the stack. The Server, Session, Window, and Pane classes (all main tmux objects) support this.

Most readers never reach for this. If you’re building a long-running application, you typically let objects persist and tear them down yourself. The context-manager form earns its keep in test fixtures and short-lived scripts, where you want a tmux object to exist for exactly one block and then vanish.

Open two terminals:

Terminal one: start tmux in a separate terminal:

$ tmux

Terminal two, python or ptpython if you have it:

$ python

Import libtmux:

>>> import libtmux

Server context manager¶

You create a temporary server that will be killed when you’re done:

>>> with Server() as server:
...     session = server.new_session()
...     print(server.is_alive())
True
>>> print(server.is_alive())  # Server is killed after exiting context
False

Session context manager¶

You create a temporary session that will be killed when you’re done:

>>> server = Server()
>>> with server.new_session() as session:
...     print(session in server.sessions)
...     window = session.new_window()
True
>>> print(session in server.sessions)  # Session is killed after exiting context
False

Window context manager¶

You create a temporary window that will be killed when you’re done:

>>> server = Server()
>>> session = server.new_session()
>>> with session.new_window() as window:
...     print(window in session.windows)
...     pane = window.split()
True
>>> print(window in session.windows)  # Window is killed after exiting context
False

Pane context manager¶

You create a temporary pane that will be killed when you’re done:

>>> server = Server()
>>> session = server.new_session()
>>> window = session.new_window()
>>> with window.split() as pane:
...     print(pane in window.panes)
...     pane.send_keys('echo "Hello"')
True
>>> print(pane in window.panes)  # Pane is killed after exiting context
False

Nested context managers¶

For complex setups, you can nest contexts to build a whole tmux hierarchy at once and have every layer torn down for you:

>>> with Server() as server:
...     with server.new_session() as session:
...         with session.new_window() as window:
...             with window.split() as pane:
...                 pane.send_keys('echo "Hello"')
...                 # Do work with the pane
...                 # Everything is cleaned up automatically when exiting contexts

This ensures that:

  1. The pane is killed when exiting its context

  2. The window is killed when exiting its context

  3. The session is killed when exiting its context

  4. The server is killed when exiting its context

The cleanup happens in reverse order (pane → window → session → server), ensuring proper resource management.

Benefits¶

Reaching for a context manager buys you a few things. Resources clean themselves up the moment you leave the block, so you never manually call the kill(), kill(), kill(), or kill() methods and the code stays uncluttered. Because cleanup runs on the way out of the block, it fires even when an exception unwinds the stack — so you don’t leak a stray session or pane on the error path. And when you nest contexts, the objects tear down in hierarchical order, which keeps tmux’s own bookkeeping consistent.

When to use¶

Use context managers when you’re writing test fixtures, running short-lived sessions, or managing several tmux servers that each need to disappear cleanly. They also pay off in any script that might raise partway through, or when you’re spinning up an isolated environment that has to be cleaned up afterward.