Почему os.system блокирует выполнение программы?

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

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

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

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

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

3 ответа

Решение

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

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

От 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, так что он останавливается после одной или нескольких попыток.

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

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

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

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

Другие вопросы по тегам