Issuing commands to psuedo shells (pty)
Question: I've tried to use the subprocess, popen, os.spawn to get a process running,
but it seems as though a pseudo terminal is needed.

    
    
    import pty
    
    (master, slave) = pty.openpty()
    
    os.write(master, "ls -l")
    

Should send "ls -l" to the slave tty... I tried to read the response
os.read(master, 1024), but nothing was available.

EDIT:

Also tried to create pty's, then open the call in a subprocess -- still didn't
work.

    
    
    import pty
    import subprocess
    
    (master, slave) = os.openpty()
    p = subprocess.Popen("ls", close_fds=True, shell=slave, stdin=slave, stdout=slave)
    

Similar:

[Send command and exit using python pty pseudo terminal
process](http://stackoverflow.com/questions/8710829/send-command-and-exit-
using-python-pty-pseudo-terminal-process)

[How do *nix pseudo-terminals work ? What's the master/slave
channel?](http://stackoverflow.com/questions/476354/how-do-nix-pseudo-
terminals-work-whats-the-master-slave-channel)


Answer: Use `pty.spawn` instead of `os.spawn`. Here's a function that runs a command
in a separate pty and returns its output as a string:

    
    
    import os
    import pty
    
    def inpty(argv):
      output = []
      def reader(fd):
        c = os.read(fd, 1024)
        while c:
          output.append(c)
          c = os.read(fd, 1024)
    
      pty.spawn(argv, master_read=reader)
      return ''.join(output)
    
    print "Command output: " + inpty(["ls", "-l"])
    

