Осторожно: subprocess.call
не вернется до завершения дочернего процесса. Таким образом, у вас нет возможности записать что-либо на стандартный ввод дочернего элемента.
Если вы можете подготовить кучу команд заранее и если выходные данные не рискуют заполнить системный буфер, вы все равно можете использовать call таким образом:
cmds = "a\nb\nc\n"
p = subprocess.call(['program.exe'],
stdin=io.StringIO(cmds),
stdout=subprocess.PIPE,
)
Но более надежный способ заключается в непосредственном использовании конструктора Popen и последующем вводе:
p = subprocess.Popen(['program.exe'],
stdin=subprocess.PIPE,
stdout=subprocess.PIPE,
)
p.stdin.write("a\n");
p.stdin.write("b\n");
...
p.stdin.close();
p.wait();
Если вы знаете, что одна подкоманда будет генерировать очень большие Вывод вы можете прочитать перед отправкой следующего. Остерегайтесь блокировки, ожидая ввода, который ребенок еще не отправил ...