Почему os.system блокирует выполнение программы? - PullRequest
0 голосов
/ 11 февраля 2019

Я пытаюсь создать программу для простой обработки ИТ-запросов, и я создал программу для проверки, активен ли ПК в моей сети из списка.

Для этого я написал следующеекод:

self.btn_Ping.clicked.connect(self.ping)

def ping(self):
        hostname = self.listWidget.currentItem().text()
        if hostname:
            os.system("ping " + hostname + " -t")

Когда я запускаю его, моя основная программа зависает, и я ничего не могу сделать, пока не закрою окно команды ping.Что я могу сделать по этому поводу?Есть ли какая-либо другая команда, которую я могу использовать, чтобы попытаться пропинговать компьютер, не останавливая основную программу?

Ответы [ 3 ]

0 голосов
/ 11 февраля 2019

Из ping документации:

ping /?

Options:
-t             Ping the specified host until stopped.
               To see statistics and continue - type Control-Break;
               To stop - type Control-C.

Итак, используя -t, вы ждете, пока эта машина не остановится, и в случае, если эта машина не останавливается, ваш скрипт Python будет работать вечно.

Как упомянуто HyperTrashPanda, используйте другой параметр для запуска ping, чтобы он останавливался после одной или нескольких попыток.

0 голосов
/ 15 февраля 2019

Как уже упоминалось в ответе Тима Пицкера, настоятельно рекомендуется использовать subprocess вместо os.system (и других).

Чтобы отделить новый процесс от вашего сценария, используйтеsubprocess.Popen.Вы должны получить вывод, напечатанный обычно в sys.stdout.Если вы хотите что-то более сложное (например, только для печати чего-либо, если что-то меняется), вы можете установить аргументы stdoutstderr и stdin):

Допустимые значения - PIPE,DEVNULL, существующий файловый дескриптор (положительное целое число), существующий файловый объект и None.PIPE указывает, что должна быть создана новая труба для дочернего элемента.DEVNULL указывает, что будет использоваться специальный файл os.devnull.При настройках по умолчанию None перенаправление не происходит;дескрипторы файла потомка будут унаследованы от родителя.
- документы по подпроцессам. Откройте , если вы прокрутите вниз

Если вы хотите получить код выхода,используйте myPopenProcess.poll().

0 голосов
/ 11 февраля 2019

docs заявляет, что os.system() возвращает значение, возвращаемое вызванной вами командой, поэтому блокирует вашу программу до ее выхода.

Они также утверждают, что вы должны использовать subprocess модуль вместо.

...