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
aW1wb3J0IHN1YnByb2Nlc3MKCgojIyMg0KHQv9C+0YHQvtCxIDEsINC10LHQsNC90YPRgtGL0LkKIyDQt9Cw0L/Rg9GB0LrQsNC10Lwg0YHRg9Cx0L/RgNC+0YbQtdGB0YEKcHJvYyA9IHN1YnByb2Nlc3MuUG9wZW4oJ01ZX0dMT1JJT1VTX0VYRUNVVEFCTEUnLCAKCQkJCQkJc3RkaW49c3VicHJvY2Vzcy5QSVBFLCAKCQkJCQkJc3Rkb3V0PXN1YnByb2Nlc3MuUElQRSwKCQkJCQkJc3RkZXJyPXN1YnByb2Nlc3MuU1RET1VUKSAjINC+0YjQuNCx0LrQuCDRgtC+0LbQtSDQsiBzdGRvdXQKCiMg0L/QvtC60LAg0L/RgNC+0YbQtdGB0YEg0L3QtSDQt9Cw0LLQtdGA0YjQuNC70YHRjwp3aGlsZSBwcm9jLnBvbGwoKSBpcyBOb25lOgogICAgIyDRh9C40YLQsNC10Lwg0LXQs9C+IHN0ZG91dCDQv9C+INC+0LTQvdC+0Lkg0YHRgtGA0L7QutC1CiAgICBvdXRwdXQgPSBwcm9jLnN0ZG91dC5yZWFkbGluZSgpCiAgICBwcmludChvdXRwdXQpCiAgICAjINC/0LjRiNC10Lwg0LIg0LXQs9C+IHN0ZGluCiAgICBwcm9jLnN0ZGluLndyaXRlKCkKICAgIAojIyMg0KHQv9C+0YHQvtCxIDIsINC/0YDQuNC/0LjQt9C00L3Rg9GC0YvQuQpwaXBlID0gb3MucGlwZSgpCiMg0LfQsNC/0YPRgdC60LDQtdC8INGB0YPQsdC/0YDQvtGG0LXRgdGBIDEKcHJvYzEgPSBzdWJwcm9jZXNzLlBvcGVuKCdNWV9HTE9SSU9VU19FWEVDVVRBQkxFMScsIAoJCQkJCQlzdGRpbj1zdWJwcm9jZXNzLlBJUEUsIAoJCQkJCQlzdGRvdXQ9cGlwZSwKCQkJCQkgCXN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCkKIyDQt9Cw0L/Rg9GB0LrQsNC10Lwg0YHRg9Cx0L/RgNC+0YbQtdGB0YEgMgpwcm9jMiA9IHN1YnByb2Nlc3MuUG9wZW4oWydweXRob24nLCAnb2xvbG8ucHknXSwgCgkJCQkJCXN0ZGluPXBpcGUsIAoJCQkJCQlzdGRvdXQ9cHJvYzEuc3RkaW4sCgkJCQkJCXN0ZGVycj1zdWJwcm9jZXNzLlNURE9VVCkKIyDQv9Cw0LnQv9GLIHByb2MxINC4IHByb2MyINC30LDQvNC60L3Rg9GC0Ysg0LTRgNGD0LMg0L3QsCDQtNGA0YPQs9CwCiMg0LbQtNC10Lwg0L/QvtC60LAg0L/RgNC+0YbQtdGB0YHRiyDQvdC1INC30LDQstC10YDRiNCw0YLRgdGPCnByb2MxLndhaXQoKQpwcm9jMi53YWl0KCkKCiMjIyDQodC/0L7RgdC+0LEgMywgc29ja2V0ICsgc2VsZWN0CiMg0KLRg9GCINCx0L7Qu9GM0YjQtSDRh9C10LwgMi0zINGB0YLRgNC+0YfQutC4INC60L7QtNCwLiDQk9GD0LPQu9C4IHB5dGhvbiBub24tYmxvY2tpbmcgc29ja2V0cywgcHl0aG9uIHNlbGVjdC5zZWxlY3QKIyDQn9C70Y7RgdC+0Lwg0LHRg9C00LXRgiDQstC+0LfQvNC+0LbQvdC+0YHRgtGMINC30LDQv9GD0YHQutCw0YLRjCDRgdC60YDQuNC/0YLRiyDQvdCwINGA0LDQt9C90YvRhSDQvNCw0YjQuNC90LDRhS4KCiMjIyDQodC/0L7RgdC+0LEgNCwgYXN5bmNpbyBBYnN0cmFjdEV2ZW50TG9vcC5zdWJwcm9jZXNzX2V4ZWMKIyDQodCw0LzRi9C5INC80L7QtNC90YvQuSDQuCDQvNC+0LvQvtC00LXQttC90YvQuSDRgdC/0L7RgdC+0LEuINCi0YDQtdCx0YPQtdGCINC30L3QsNC90LjRjyBhc3luY2lvCg==