import subprocess


### Способ 1, ебанутый
# запускаем субпроцесс
proc = subprocess.Popen('MY_GLORIOUS_EXECUTABLE', 
						stdin=subprocess.PIPE, 
						stdout=subprocess.PIPE,
						stderr=subprocess.STDOUT) # ошибки тоже в stdout

# пока процесс не завершился
while proc.poll() is None:
    # читаем его stdout по одной строке
    output = proc.stdout.readline()
    print(output)
    # пишем в его stdin
    proc.stdin.write()
    
### Способ 2, припизднутый
pipe = os.pipe()
# запускаем субпроцесс 1
proc1 = subprocess.Popen('MY_GLORIOUS_EXECUTABLE1', 
						stdin=subprocess.PIPE, 
						stdout=pipe,
					 	stderr=subprocess.STDOUT)
# запускаем субпроцесс 2
proc2 = subprocess.Popen(['python', 'ololo.py'], 
						stdin=pipe, 
						stdout=proc1.stdin,
						stderr=subprocess.STDOUT)
# пайпы proc1 и proc2 замкнуты друг на друга
# ждем пока процессы не завершатся
proc1.wait()
proc2.wait()

### Способ 3, socket + select
# Тут больше чем 2-3 строчки кода. Гугли python non-blocking sockets, python select.select
# Плюсом будет возможность запускать скрипты на разных машинах.

### Способ 4, asyncio AbstractEventLoop.subprocess_exec
# Самый модный и молодежный способ. Требует знания asyncio
