Почему 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 ответа
От 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()
,