Во-первых, никогда не используйте os.system
.Всегда используйте модуль subprocess
для запуска новых процессов, поскольку он намного лучше обрабатывает многие крайние случаи.subprocess.check_call
может сделать все, что может os.system
, и многое другое, и он проверяет ошибки, чего-то os.system
не делает.
Во-вторых, не используйте gnome-terminal
для создания интерактивноготерминал для запуска вашего подпроцесса!Вместо этого создайте псевдотерминал (pty);Таким образом, ваша программа может контролировать поведение ребенка.Под капотом работает такая программа, как gnome-terminal
: она создает pty для оболочки и запускаемых оболочкой программ, а затем читает из pty и визуализирует результаты графически.
Ваша программа может создать pty для каждой дочерней программы, которую вы хотите запустить, и тогда ваша программа может взаимодействовать с дочерней программой точно так же, как gnome-terminal
.Вы можете сделать это с помощью модуля pty
в стандартной библиотеке Python, но вы можете рассмотреть возможность использования пакета pexpect
, поскольку это существенно упрощает процесс.
Если вам не нужна полная версиятерминал, вы можете сделать это еще проще, просто открыв канал для дочернего процесса.Модуль subprocess
в стандартной библиотеке предоставляет класс Popen
, который можно использовать для этого.
В вашем конкретном случае я бы порекомендовал pexpect
.Он прост в использовании и будет «делать правильные вещи» для такой работы.