Архив метки: Python

Скрипт Python для мониторинга сетевого подключения

Постоянное подключение наших устройств к Интернету становится скорее основной потребностью, чем дополнительной привилегией.

Наличие приложений и устройств, которым необходимо регистрировать, отправлять и получать данные во внешний мир, имеет решающее значение. Таким образом, наличие инструмента, который позволяет вам отслеживать, когда ваша сеть выходит из строя, может помочь вам устранить неполадки в сети или остановить приложения перед отправкой кучи ошибок журнала.

В сегодняшней статье мы создадим простой сетевой монитор, который постоянно отслеживает ваше подключение к Интернету, отправляя запросы ping на внешний ресурс. Сценарий, который мы создадим, также будет вести журналы, когда интернет не работает и продолжительность простоя:

 

Требования к проекту

Для этого проекта нам понадобятся только:

  • Основы программирования на Python
  • Базовое понимание компьютерных сетей.
  • Удобно пользоваться терминалом.

 

Логика проекта

Прежде чем мы углубимся в кодирование, давайте обсудим и поймем, чего мы пытаемся достичь:

 

Что такое время работы и простоя сети?

Когда мы говорим о работоспособности и простоях сети, мы имеем в виду период, когда сетевое соединение полностью недоступно, и, таким образом, мы не можем общаться с устройствами за пределами нашей сети. Чем дольше недоступен Интернет, тем дольше будет время простоя.

 

Как определить время простоя

Теперь, когда мы знаем, что такое простои в Интернете, вы, возможно, задаетесь вопросом: «Как нам его определить?»

Не усложняя наш код, мы можем использовать ping. Проверка связи — это метод, при котором мы постоянно проверяем связь с надежным сервером, например Cloudflare или Google DNS, а затем ждем ответа.

Если мы пингуем сервер и нет ответа, мы отмечаем это конкретное время и продолжаем пинговать, пока не получим пинг и не отметим время.

По разнице во времени мы можем отметить, когда и как долго не работал интернет.

Мы также должны быть осторожны при пинге отдельного сервера, потому что мы можем ошибочно принять пинг за DDoS-атаку, что может привести к блокировке нашего IP-адреса, что приведет к отрицательным результатам.

Вот блок-схема, объясняющая эту концепцию:

Скрипт Python для мониторинга сетевого подключения

 

Давайте теперь погрузимся в код, показывающий, как реализовать эту логику:

 

Теперь покажите мне код

Как обычно, в Python мы начинаем с импорта необходимых библиотек. Затем мы создаем файл журнала в текущем рабочем каталоге.

Мы используем библиотеку сокетов для отправки запроса на внешний IP-адрес в первой функции. В этом примере мы используем общедоступный DNS-адрес Cloudflare, который имеет очень высокое время безотказной работы. Мы также передаем порт, и, поскольку это DNS-сервер, используем порт 53.

Затем мы проверяем, что у нас есть доступ к каталогу файла журнала, и выходим, если у нас нет доступа.

Следующим шагом будет вычисление времени отключения сетевого подключения. Наконец, мы заключаем всю функциональность в цикл, как показано в приведенном ниже коде.

import socket

import time

import datetime

import os

import sys

LOG_FNAME = "network.log"

FILE = os.path.join(os.getcwd(), LOG_FNAME)

def send_ping_request(host="1.1.1.1", port=53, timeout=3):

try:

socket.setdefaulttimeout(timeout)

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)

s.connect((host,port))

except OSError as error:

return False

else:

s.close()

return True

def write_permission_check():

try:

with open(FILE, "a") as file:

pass

except OSError as error:

print("Ошибка создания файла журнала")

sys.exit()

finally:

pass

def calculate_time(start, stop):

time_difference = stop - start

seconds = float(str(time_difference.total_seconds()))

return str(datetime.timedelta(seconds=seconds)).split(".")[0]

def mon_net_connection(ping_freq=2):

monitor_start_time = datetime.datetime.now()

motd = "Мониторинг сетевого подключения начат в: " + str(monitor_start_time).split(".")[0] + " Отправка запроса ping в " + str(ping_freq) + " секунды"

print(motd)



with open(FILE, "a") as file:

file.write("n")

file.write(motd + "n")

while True:

if send_ping_request():

time.sleep(ping_freq)

else:

down_time = datetime.datetime.now()

fail_msg = "Сетевое соединение недоступно в: " + str(down_time).split(".")[0]

print(fail_msg)

with open(FILE, "a") as file:

file.write(fail_msg + "n")

i = 0

while not send_ping_request():

time.sleep(1)

i += 1

if i >= 3600:

i = 0

now = datetime.datetime.now()

continous_message = "Постоянная недоступность сети: " + str(now).split(".")[0]

print(continous_message)

with open(FILE, "a") as file:

file.write(continous_message + "n")

up_time = datetime.datetime.now()

uptime_message = "Сетевое подключение восстановлено: " + str(up_time).split(".")[0]



down_time = calculate_time(down_time, up_time)

_m = "Подключение к сети было недоступно для " + down_time



print(uptime_message)

print(_m)



with open(FILE, "a") as file:

file.write(uptime_message + "n")

file.write(_m + "n")

mon_net_connection()




Заключение

Используя приведенный выше сценарий, мы можем отслеживать, когда сетевое соединение потеряно, и постоянно регистрировать его, пока оно не станет доступным. Этот простой сценарий открыт для улучшений. Не стесняйтесь изменять код в соответствии со своими потребностями и расширять его.



2021-01-25T11:27:42
Python

Как разбить строку в Python

При работе со строками одной из повседневных операций является разделение строки на массив подстрок с использованием заданного разделителя.

В этой статье мы поговорим о том, как разбить строку в Python.

.split () Метод

В Python строки представлены как неизменяемые объекты str . Класс str имеет ряд строковых методов, которые позволяют управлять строкой.

Метод .split() возвращает список подстрок, разделенных разделителем. Требуется следующий синтаксис:

str.split(delim=None, maxsplit=-1)

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

В примере ниже мы разделяем строку s используя запятую ( , ) в качестве разделителя:

s = 'Sansa,Tyrion,Jon's.split(',')

Результатом является список строк:

['Sansa', 'Tyrion', 'Jon']

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

Последовательность символов также может использоваться в качестве разделителя:

s = 'Sansa::Tyrion::Jon's.split('::')

['Sansa', 'Tyrion', 'Jon']

Когда maxsplit , он ограничивает количество разделений. Если не указано или -1 , ограничение на количество разделений отсутствует.

s = 'Sansa;Tyrion;Jon's.split(';', 1)

В списке результатов будет максимальное maxsplit+1 элементов maxsplit+1 :

['Sansa', 'Tyrion;Jon']

Если delim не указан или имеет значение Null , строка будет разделена с использованием пробела в качестве разделителя. Все последовательные пробелы считаются одним разделителем. Кроме того, если строка содержит завершающие и ведущие пробелы, в результате не будет пустых строк.

Чтобы лучше проиллюстрировать это, давайте взглянем на следующий пример:

' Daenerys  Hodor Arya   Jaime Bran '.split()

['Daenerys', 'Hodor', 'Arya', 'Jaime', 'Bran']

' Daenerys  Hodor Arya   Jaime Bran '.split(' ')

['', 'Daenerys', '', 'Hodor', 'Arya', '', '', 'Jaime', 'Bran', '']

Если разделитель не используется, возвращаемый список не содержит пустых строк. Если в качестве разделителя установлено пустое пространство ' ' то начальные, конечные и последовательные пробелы приведут к тому, что результат будет содержать пустые строки.

Выводы

Разделение строк — одна из самых основных операций. Прочитав это руководство, вы должны хорошо понимать, как разбивать строки в Python.

Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.



2021-01-07T20:32:08
Python

Обратный список Python

При работе со списками в Python иногда может потребоваться перевернуть элементы списка. Обратное преобразование списка означает, что первый элемент списка становится последним, второй — предпоследним, последний элемент становится первым и так далее.

В Python есть несколько разных способов перевернуть список, в зависимости от того, что вы пытаетесь сделать.

reverse() метод

reverse() — это метод типа данных списка, который меняет местами элементы списка. Этот метод изменяет исходный список, а не создает новый.

Синтаксис метода reverse() следующий:

list.reverse()

reverse() не принимает аргументы.

Вот пример:

capitals = ['Oslo', 'Skopje', 'Riga', 'Madrid']

capitals.reverse()

print('Reversed list:', capitals)

Reversed list: ['Madrid', 'Riga', 'Skopje', 'Oslo']

функция reversed()

reversed() — это встроенная функция Python, которая возвращает обратный итератор заданного итеративного объекта. Исходный список не изменяется.

Если вы хотите перебирать элементы списка только в обратном порядке, предпочтительнее использовать функцию reversed() , так как это быстрее, чем перестановка элементов на месте`.

Синтаксис функции reversed() следующий:

reversed(seq) 

Где seq — это список, который нужно восстановить.

Ниже приведен пример использования функции reversed() для перебора элементов списка в обратном порядке:

numbers = [1, 2, 3, 4]

for i in reversed(numbers) :
    print(i)

4
3
2
1

Если вы хотите преобразовать обратный итератор в список, используйте конструктор list() :

numbers = [1, 2, 3, 4]

print(list(reversed(numbers)))

[4, 3, 2, 1]

Перевернуть список с помощью нарезки

Нотация срезов — это встроенная функция Python, которая позволяет извлекать части последовательного типа данных. Хотя это и не очень Pythonic, вы можете использовать нотацию [::-1] перевернув список:

numbers = [1, 2, 3, 4]

print(numbers[::-1])

Результатом нарезки списка является новый список, содержащий извлеченные элементы. Исходный список не изменяется.

[4, 3, 2, 1]

Выводы

Чтобы перевернуть список Python на месте, используйте метод reverse() . Если вам нужно создать только обратный итератор, используйте функцию reversed() .

Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.



2021-01-05T14:24:35
Python

Абсолютное значение в Python

Числа — очень важный аспект любого языка программирования. Числа включают целые числа, числа с плавающей запятой и комплексные числа. Числа могут быть положительными или отрицательными. Иногда нам нужно получить абсолютное значение числа для выполнения математических операций, таких как сложение, вычитание и т. д. Абсолютное значение обозначает неотрицательное значение данного числа. Python предоставляет встроенную функцию abs() для поиска абсолютного значения числа. В этой статье объясняется использование функции abs() на простых примерах.

 

Синтаксис функции abs()

Функция abs() принимает число и возвращает абсолютное значение. Синтаксис функции abs() следующий:

abs(number)

 

Число может быть целым числом, числом с плавающей запятой или комплексным числом. В случае комплексного числа функция abs() возвращает значение величины.

 

Нахождение абсолютного значения целых чисел и числа с плавающей запятой

Теперь давайте воспользуемся функцией abs(), чтобы найти абсолютное значение целых чисел и чисел с плавающей запятой.

# Программа Python для поиска абсолютного значения



# Использование функции abs()



print("Абсолютное значение -20 равно:", abs(- 20))



print("Абсолютное значение -40,5 равно:", abs(- 40,5))



print("Абсолютное значение -10.9867 равно:", abs(- 10.9867))



print("Абсолютное значение 50,09 равно:", abs(50.09))



print ("Абсолютное значение -101,98 равно:", abs(- 101,98))



print("Абсолютное значение 30,08 равно:", abs(30,08))



print("Абсолютное значение -200 равно:", abs(- 200))



print("Абсолютное значение -10 равно:", abs(- 10))



print("Абсолютное значение -90 равно:", abs(- 90))




Вывод

На выходе отображаются абсолютные значения различных чисел.

 

Функция abs() принимает только число в качестве аргумента. Если мы передаем в качестве аргумента какой-либо символ или строковое значение, интерпретатор Python выдает ошибку “bad operand type for abs()”.

Программа Python для поиска абсолютного значения

# использование функции abs()



print(abs("a"))




Теперь давайте найдем абсолютное значение двух чисел и вычислим сумму.

# Программа Python для нахождения абсолютного значения

# использование функции abs()



# объявление первого числа

num1 = - 10



# объявление второго числа

num2 = - 20.04



# вывод суммы

print("сумма: ", abs(num1+num2))


 

Нахождение абсолютного значения комплексных чисел

Как мы ранее обсуждали, в случае комплексного числа функция abs() возвращает значение величины. Давайте воспользуемся функцией abs(), чтобы найти величину комплексного числа в нашем скрипте.

# Программа Python для определения абсолютного значения 

# с помощью функции abs()

num = -4-3j

print("Величина -4-3j равна:", abs(num))



num = 4+3j

print("Величина 4+3j равно: ", abs(num))



num = 5-7j

print(" Величина 5-7j равна: ", abs(num))



num = -1+6j

print ("Величина -1+6j равна:", abs(num))




Заключение

Функция abs() вычисляет и возвращает абсолютное значение заданного числа. В случае комплексных чисел функция abs() возвращает значение величины. Эта статья демонстрирует использование функции abs() с примерами.



2021-01-01T23:06:39
Python

Оператор модуля Python

Операция по модулю — это арифметическая операция, которая находит остаток от деления одного числа на другое. Остаток называется модулем операции.

Например, 5, разделенное на 3, равно 1 с остатком 2, а 8, разделенное на 4, равно 2, с остатком 0.

Оператор модуля Python

В Python оператор по модулю представлен знаком процента ( % ). Синтаксис следующий:

num1 % num2

Вот пример:

5 % 4

1

Если делитель (второй аргумент) равен нулю, возникает ZeroDivisionError :

5 % 0

ZeroDivisionError: integer division or modulo by zero

Оператор по модулю также принимает плавающие числа в качестве аргументов:

6.8 % 3.4

0.0

При форматировании строк символ % представляет оператор интерполяции.

Примеры

Один из распространенных случаев использования оператора по модулю — проверка четности или нечетности числа. Если число, деленное на 2, не имеет остатка, то это четное число. В противном случае, если остается 1, то число нечетное:

num = 11

if (num % 2) == 0:
   print(num, "is even")
else:
   print(num, "is odd")

Если вы запустите приведенный выше код, 11 % 2 оставит остаток 1 и будет выполнен код внутри оператора else :

11 is odd

Вот еще один пример, показывающий, как с помощью оператора по модулю проверить, является ли число простым. Простое число — это целое положительное число, которое без остатка можно разделить только на себя и на 1:

def isPrimeNumber(num):
  if num < 1:
    return False
  for i in range(2, num):
    if (num % i) == 0:
      return False
  else:
    return True

Сначала мы проверяем, является ли число num положительным числом. Затем мы проверяем, делится ли число на другое число в диапазоне от 2 до num без напоминания. Если ни одно из условий не выполняется, число простое.

Оператор по модулю также может использоваться для преобразования единиц измерения. В следующем примере показано, как преобразовать секунды в минуты:

def secondsToMinutes(sec):
  seconds = sec // 60
  minutes = sec % 60
  return "%d minutes and %d seconds" % (minutes, seconds)

secondsToMinutes(657)

'57 minutes and 10 seconds'

Двойная косая черта ( // ), оператор деления по этажам округляет результат до ближайшего целого числа.

Выводы

В этой статье мы показали вам, как использовать оператор Python по модулю.

Если у вас есть какие-либо вопросы или отзывы, не стесняйтесь оставлять комментарии.



2021-01-01T16:20:37
Python

Функция getattr() в Python

Огромное количество встроенных модулей, функций и операторов Python помогает программистам выполнять различные задачи. Функция getattr() — это встроенная функция Python, которая позволяет программистам получать доступ к значению атрибута объекта. Если значение не найдено, функция getattar() возвращает значение по умолчанию. По этой причине функция getattr() используется в основном для доступа к значениям атрибутов объектов. Эта статья предоставит подробное объяснение функции getattr() с некоторыми примерами.

 

Синтаксис

Прежде чем перейти к реализации функции getattr(), сначала обсудим ее синтаксис. Синтаксис функции getattr() следующий:

getattr(object_name,attribute_name,defalut_value)

 

Функция getattr() принимает в качестве аргумента три параметра:

  • object_name: имя объекта, к атрибуту которого нам нужно получить доступ.
  • attribute_name: имя атрибута, к которому нам нужно получить доступ.
  • default_value: значение по умолчанию, которое возвращается, если атрибут не найден.

 

Если атрибут name не найден и мы не определяем default_value, функция getattar() вызывает исключение AttributeError.

 

Примеры

Теперь мы рассмотрим несколько примеров с использованием функции getattr(). Мы создали студенческий класс и определили некоторые атрибуты для этого класса. Мы получаем доступ к этим атрибутам с помощью функции getattar().

# создание класса студент

class Student:

#определение атрибута name

name = "AndreyEx"

#определение атрибута email

email = "AndreyEx@example.ru"

# Создание объекта класса ученика

std_obj = Student()

# теперь std_obj - наш объект

# доступ к атрибуту имени

print("Значение атрибута имени:", getattr(std_obj, 'name'))

# доступ к атрибуту электронной почты

print("Значение атрибута электронной почты:", getattr (std_obj, 'email'))


 

Вывод

Функция getattr() успешно вернула значения атрибутов.

Теперь мы попытаемся получить доступ к атрибуту, который не определен. Мы определим значение по умолчанию для этого отсутствующего атрибута.

# создание класса Student

class Student:

# определение атрибута имени

name = "AndreyEx"

# определение атрибута электронной почты

email = "AndreyEx@example.ru"

# Создание объекта класса Student

std_obj = Student()

# Теперь std_obj - наш объект

# доступ к атрибуту age

print("Возраст:", getattr(std_obj, 'age', ' Более 20'))


 

Определенное значение — «Больше 20».

Вывод

В случае отсутствия атрибута «age» печатается определенное значение.

Если значение не определено, функция getattr() вызовет исключение AttributeError. Давайте посмотрим на пример этого.

# создание класса Student

class Student:

# определение атрибута name

name = "AndreyEx"

# определение атрибута email

email = "AndreyEx@example.ru" 

std_obj = Student()

# теперь std_obj - наш объект

# доступ к атрибуту age

print("Возраст:", getattr(std_obj, 'age'))


 

Вы также можете использовать функцию getattr() с namedtuple для доступа к значениям. Namedtuple — это контейнер типа словаря, но вы можете получить доступ к его значениям с помощью функции getattar(). Namedtuple — это класс модуля коллекций. Давайте реализуем именованный кортеж и получим доступ к значениям с помощью функции getattr(). Мы создаем именованный набор для student.

# импорт модуля collections

import collections

# создание именованного кортежа для ученика

# name и age - это ключи

Student = collections.namedtuple('Student', [ 'name', 'age' ])

# создание нового учителя и добавление значений

std = Student("AndreyEx", 21)

print("Имя:", getattr(std, "name"))

print("Возраст:", getattr(std, "age"))


 

Заключение

Функция getattar() — это встроенная функция в Python, которая возвращает значение атрибута объекта. Основная причина использования функции getattr() заключается в том, что она упрощает доступ к значению атрибута, используя имя атрибута. Имя атрибута определяется как строка, а значение мы получаем с помощью функции getattar(). Также можно определить значение для отсутствующего атрибута. Надеюсь, после прочтения этой статьи вы узнали больше о том, как использовать функцию getattar() в Python.



2020-12-26T18:43:33
Python