Я использую команду os.system ("ping 192.168.178.5") для проверки связи с машиной. Забавно, я получаю код выхода 0, даже если пинг не удается.
Как я могу получить то, что говорит мне о сбое проверки связи / хост не в сети?
Я не пользователь Python, но можно найти много материала по этой проблеме.
Например, пост pinging в локальной сети на python содержит два решения, которые я воспроизвожу здесь (не проверено).
Решение 1. Анализ выходных данных команды ping.
import subprocess
hostname = "10.20.16.30"
output = subprocess.Popen(["ping.exe",hostname],stdout = subprocess.PIPE).communicate()[0]
print(output)
if ('unreachable' in output):
print("Offline")
Можно также проверить этот способ на "Время ожидания запроса".
Решение 2. Использование сокета (адаптировано из оригинального кода, поэтому не гарантируется)
s = socket(AF_INET, SOCK_STREAM) # Creates socket
host = 'localhost' # Enter the IP of the workstation here
port = 80 # Select port which should be pinged
try:
s.connect((host, port)) # tries to connect to the host
except ConnectionRefusedError: # if failed to connect
print("Server offline") # server is offline
s.close() # close socket
Использование команды os.system ("ping 192.168.178.5")
для проверки связи с машиной зависит от системы, в которой вы находитесь.
Из онлайн- справки для Ping под windows:
Успешный PING НЕ всегда возвращает% errorlevel% от 0. Поэтому, чтобы надежно определить успешный пинг, перенаправьте вывод в FIND и ищите текст "TTL".
Похоже, вам следует использовать вместо ping 192.168.178.5
что-то вроде ping -n 1 192.168.178.5 | find "TTL="
От man ping
на Linux (Руководство системного менеджера: iputils)
Если ping вообще не получает ответных пакетов, он завершается с кодом 1. Если указано количество пакетов и крайний срок, и к моменту наступления крайнего срока получено меньше пакетов, чем количество пакетов, он также завершится с кодом 1. При другой ошибке он выходит с кодом 2. В противном случае он выходит с кодом 0. Это позволяет использовать код выхода, чтобы увидеть, жив хост или нет.
В этом случае вы можете использовать непосредственно код выхода.