Python и подпроцесс - открыть сеанс терминала как пользователь и выполнить одну / две команды - PullRequest
1 голос
/ 13 марта 2019

Несмотря на то, что я ненавижу повторяющиеся вопросы, это неизбежное зло для достижения результата следующего выпуска, который я представлю.

Используя python3, tkinter и пакет подпроцесса, моя цель - написать элемент управленияпанель для запуска и остановки различных окон терминала с определенным набором команд для запуска приложений / сеансов из стека приложений ROS , включая ядро.

Как таковые,код должен выглядеть следующим образом для каждого исполняемого файла, которым я хочу управлять:

class TestProc(object):
def __init__(self):
    pass

def start(self):
    self.process = subprocess.Popen(["gnome-terminal", "-c", "'cd /path/to/executable/script.sh; ./script.sh'"])
    print("Process started.")

def stop(self):
    self.process.terminate()
    print("Process terminated.")

В настоящее время возможно запустить окно терминала и назначенные команды / процессы, но две проблемы сохраняются:

  • gnome-terminal настроен для запуска окна терминала, а затем для снятия контроля над процессами внутри;как таковой, у меня нет больше контроля, как только это началосьВозможное решение для этого - использовать xterm, что создает множество других проблем.Мне необходимо иметь переменные от пользователя .bashrc и / или export
  • Некоторые "глобальные команды", например.cd или roslaunch будут недоступны для сеансов терминала, возможно, из-за порядка выполнения (например, команды запускаются до загрузки профиля bash), что предотвращает любой используемый терминал вообще

Таким образом, возникает вопрос: как я смогу запустить и остановить новое окно терминала, которое будет запускать до двух команд / процессов в пользовательской среде?

1 Ответ

0 голосов
/ 13 марта 2019

Есть несколько подходов, которые вы можете использовать, самый гибкий здесь также самый сложный, поэтому вы должны решить, нужно ли вам это делать.

Если вам нужно только показать результатсценария, вы можете просто направить вывод в файл или в именованный канал.Затем вы можете захватить этот вывод, читая / отслеживая файл.Это самое простое, если на самом деле сценарию не нужно взаимодействовать с пользователем.

Если вам действительно нужно только запустить сценарий, работающий в фоновом режиме, и вам нужно смоделировать взаимодействие с пользователем, но вына самом деле не нужно принимать фактический пользовательский ввод, вы можете использовать подход expect (используя библиотеку pexpect ).

Если вам действительно нужно разрешить реальному пользователю взаимодействовать сПрограмма, то у вас есть два подхода.Во-первых, вы можете встроить виджет VTE в свое приложение, это наиболее бесшовная интеграция, поскольку она сделает терминал совершенно незаметным для вашего приложения, однако он также самый тяжелый.

Другой подход состоит в том, чтобы запустить gnome-терминал, как вы сделали здесь, это обязательно порождает новое окно.

Если вам нужно оба сценария взаимодействовать друг с другом, а также разрешать ввод данных пользователем, вы можете сделать это, порождая ваш сценарий в сеансе tmux.С помощью команды tmux send-keys автоматизируйте интерактивную часть луны, а затем создайте эмулятор терминала, чтобы пользователи могли взаимодействовать с tmux attach.Если вам нужно переключаться между автоматизированной частью и интерактивной частью, вы можете комбинировать этот подход с ожидаемым.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...