Как завершить бесконечный цикл while в коде bash из другого кода python? - PullRequest
0 голосов
/ 02 апреля 2019

представьте следующий бесконечный цикл while:

#!/bin/bash
i=0
while true; do
   echo $i
   i=$((i+1))
done

Я запускаю этот код из кода Python, например:

def start(self):
  filepath = '/home/sysop/.seiscomp3/program.sh'
  if os.path.exists(filepath):
     Command = "gnome-terminal -e '/home/alireza/.seiscomp3/program.sh'"
     proc = subprocess.Popen(['bash','-c', Command])
  else:
     print ("The executable file is missing. Check ~/.seiscomp3 directory ...")
def stop(self):
   proc.terminate()

приведенный выше код Python работает с другой программой (Давайте назовем это SC3) и запускает / останавливает вышеуказанный код bash в новом терминале.Когда я запускаю программу SC3, она должна запускать функцию «start» в приведенном выше коде Python (которая работает нормально).Но проблема в функции stop, которая должна уничтожать код bash, запущенный в подпроцессе.У меня вопрос, как я могу завершить этот новый терминал и его процесс?

1 Ответ

0 голосов
/ 02 апреля 2019

В настоящее время вы запускаете дополнительные процессы, что мешает отловить правильный процесс как возвращение из Popen.

Если возможно, запуск

proc = subprocess.Popen(['bash', '/home/alireza/.seiscomp3/program.sh'])

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


Учитывая, что вы передаете self функциям запуска и остановки, это заставляет меня поверить, что это методы наобъект.Если вы можете сохранить дескриптор процесса, который вы создали в этом объекте, в новом поле, это позволит вам вытащить его обратно для использования в функции остановки.


def start(self):
    filepath = '/home/sysop/.seiscomp3/program.sh'

    # Just in case the path doesn't exist
    self.proc = None

    if os.path.exists(filepath):
        Command = "gnome-terminal -e '/home/alireza/.seiscomp3/program.sh'"

        # Assign to the internal field proc
        self.proc = subprocess.Popen(['bash','-c', Command])
    else:
        print ("The executable file is missing. Check ~/.seiscomp3 directory ...")

def stop(self):
    # Make sure that the object has the proc field (It should if it has been started.)
    # AND
    # Only try to terminate if there is a process running
    if('proc' in dir(self) and self.proc):
        self.proc.terminate()

Если они не являются методами,Вы можете вернуть proc из функции запуска и передать его в функцию остановки.


start():
    # Do stuff
    return proc

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