This way is possible control any kind of command-line program.
#!/bin/python
import subprocess
import time
import threading
class ProcessRunner(threading.Thread):
def run(self):
self.process = subprocess.Popen(["vi /tmp/xpto > /tmp/viOutput"], shell = True, bufsize = 1000, stdout = subprocess.PIPE, stdin = subprocess.PIPE, stderr = subprocess.STDOUT)
pr = ProcessRunner()
pr.start()
time.sleep(1)
pr.process.stdin.write("i\n")
pr.process.stdin.flush()
time.sleep(1)
pr.process.stdin.write("Content xpto... :P\n")
pr.process.stdin.flush()
time.sleep(1)
pr.process.stdin.write(chr(27))
pr.process.stdin.flush()
time.sleep(1)
pr.process.stdin.write(":wq\n")
pr.process.stdin.flush()
If is necessary read some content from program output, you can put the output in a temp file, in this case goes to /tmp/viOutput. See with attention the line of the subprocess.Popen. Another way is use the pr.process.stdout but it dont work fine for me.
The command pr.process.stdin.write(chr(27)) write the "character" ESC, like the keyboard key.