The Python script tmux-run.py allows executing a command in a new tmux window. A tmux window is similar to a tab in other software.
If the script is executed from within a tmux session, it creates a tmux window in the same tmux session. However, if the script is executed from outside of a tmux session, it creates a new tmux window in the first available tmux session.
(Requirement: libtmux)
The Python script: tmux-run.py
#!/usr/bin/env python
# License: MIT
# Author: James Cherti
# URL: https://www.jamescherti.com/python-script-run-command-new-tmux-window/
"""Execute a command in a new tmux window.
This script allows executing a command in a new tmux window (a tmux window is
similar to a tab in other software).
- If it is executed from within a tmux session, it creates a tmux window
in the same tmux session.
- However, if the script is executed from outside of a tmux
session, it creates a new tmux window in the first available tmux session.
"""
import os
import shlex
import shutil
import sys
import libtmux
SCRIPT_NAME = os.path.basename(sys.argv[0])
def parse_args():
if len(sys.argv) < 2:
print(f"Usage: {SCRIPT_NAME} <command> [args...]",
file=sys.stderr)
sys.exit(1)
args = sys.argv[1:]
args[0] = shutil.which(args[0])
if args[0] is None:
print(f"{SCRIPT_NAME}: no {args[0]} in "
f"({os.environ.get('PATH', '')})", file=sys.stderr)
sys.exit(1)
return args
def get_tmux_session():
tmux_server = libtmux.Server()
if not tmux_server.sessions:
print(f"{SCRIPT_NAME}: the tmux session was not found",
file=sys.stderr)
sys.exit(1)
tmux_session_id = os.environ["TMUX"].split(",")[-1]
if tmux_session_id:
try:
return tmux_server.sessions.get(id=f"${tmux_session_id}")
except Exception: # pylint: disable=broad-except
pass
return tmux_server.sessions[0]
def run_in_tmux_window():
try:
command_args = parse_args()
tmux_session = get_tmux_session()
command_str = shlex.join(command_args)
tmux_session.new_window(attach=True, window_shell=command_str)
except libtmux.exc.LibTmuxException as err:
print(f"Error: {err}.", file=sys.stderr)
sys.exit(1)
if __name__ == '__main__':
run_in_tmux_window()
Code language: Python (python)