#! /usr/bin/env python import sys import os import pty import termios import fcntl def fork_xterm(master_fd, slave_fd): pid = os.fork() if pid == 0: os.close(slave_fd) helper = os.path.join( os.path.dirname(sys.argv[0]), 'interconnect_pty.py') argv = ['xterm', '-e', 'python', helper, '--master_fd', str(master_fd)] os.execvp(argv[0], argv) os.close(master_fd) return pid def exec_pgm(slave_fd, argv): os.dup2(slave_fd, 0) os.dup2(slave_fd, 1) os.dup2(slave_fd, 2) os.close(slave_fd) os.execvp(argv[0], argv) SET_CONTROLLING_TERMINAL = False def main(): master_fd, slave_fd = pty.openpty() pid = fork_xterm(master_fd, slave_fd) argv = sys.argv[1:] if SET_CONTROLLING_TERMINAL: argv[0] = os.path.abspath(argv[0]) pid = os.fork() if pid == 0: os.setsid() fcntl.ioctl(slave_fd, termios.TIOCSCTTY) exec_pgm(slave_fd, argv) else: exec_pgm(slave_fd, argv) if __name__ == '__main__': main()