Python: How to Invoke Tmux in Background

Python: How to Invoke Tmux in Background

I was trying to invoke tmux and to control the tmux from the same python script. It's stuck in tmux process creation and never returns. How do I create the process (tmux)?

#!/usr/bin/python
import time
import sys
import os
import subprocess

class Tmux(object):

    WAIT_SECS = 5

    def __init__(self, session_name, param):
        self.name = session_name
#       os.system('tmux new -s %s &' % session_name)
        subprocess.Popen(['/bin/bash', '-c', 'tmux new -s %s' % session_name])
#       subprocess.check_call('tmux new -s %s' % session_name, shell=True, close_fds=True)
# ======NOT return here, unless exit from tmux==========

    def execute(self, cmd, wait_secs=WAIT_SECS):
        time.sleep(wait_secs)
        os.system('tmux send-keys -t %s ls Enter' % self.name)

    def horizontal_split(self):
        time.sleep(1)
        os.system('tmux split-window -v -t %s' % self.name)

if __name__ == '__main__':
    print 'tmux test............'
    tmux = Tmux("tmux-test", 999)
    tmux.horizontal_split()
    tmux.execute('ls')
4

2 Answers

Module libtmux is perfect for your case, so you can manipulate tmux in Python directly.

For example, you can do

import libtmux
server = libtmux.Server()
session = server.find_where({"session_name": "session_test"})

session = server.new_session(session_name="session_test", kill_session=True, attach=False)
window = session.new_window(attach=True, window_name="session_test")
pane1 = window.attached_pane
pane2 = window.split_window(vertical=False)
window.select_layout('even-horizontal')
pane1.send_keys('ls -al')
pane2.send_keys('ls -al')

server.attach_session(target_session="session_test")
1

Part of the problem is that you are attaching to the session as soon as you create it (which requires a terminal; perhaps that is why you are trying to run bash rather than tmux directly). You should be able to simply start the session with the -d option to avoid attaching to it.

def __init__(self, session_name, param):
    self.name = session_name
    self.p = subprocess.Popen(['tmux', 'new', '-d', '-s', session_name])

You should also use subprocess for the other methods instead of os.system.

1

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.

Sarah Jenkins
Author

Sarah Jenkins

Sarah Jenkins is a veteran tech journalist with over 12 years of experience covering artificial intelligence, mobile innovations, and digital ethics. Her insights have appeared in leading technology publications worldwide.