Привет! С радостью расскажу о том‚ как можно создать функцию‚ которая будет запускать сервер на заданном порту и‚ если порт уже занят‚ найдет процесс‚ который его занимает‚ завершит его и попытается запустить сервер еще раз.Для начала‚ нам понадобится установить и импортировать модуль `subprocess`‚ который позволит нам выполнять команды в терминале. Также нам нужно будет импортировать модуль `os`‚ чтобы завершить процесс.Давай создадим функцию‚ которая будет принимать порт в качестве входного аргумента⁚
python
import subprocess
import os
def start_server(port)⁚
command f″lsof -i ⁚{port}″
output subprocess.getoutput(command) # выполнение команды в терминале и получение вывода
if ″LISTEN″ in output⁚ # если порт занят
lines output.split(‘\n’)
for line in lines⁚
if ″LISTEN″ in line⁚ # находим строку‚ которая содержит информацию о процессе
process_id line.split[1] # получаем ID процесса
os.system(f″kill {process_id}″) # завершаем процесс
# запускаем сервер еще раз
os.system(f″python -m http.server {port}″)
print(f″Сервер успешно запущен на порту {port}!″)
else⁚
# запускаем сервер‚ если порт не занят
os.system(f″python -m http.server {port}″)
print(f″Сервер успешно запущен на порту {port}!″)
В этой функции мы сначала формируем команду `lsof -i ⁚port` и используем ее в качестве входного аргумента для `subprocess.getoutput`‚ чтобы получить вывод команды. Затем мы проверяем‚ есть ли в выводе строка ″LISTEN″‚ означающая‚ что порт уже занят. Если это так‚ мы разделяем вывод по строкам и ищем строку‚ содержащую ″LISTEN″. Затем мы получаем ID процесса и завершаем его с помощью `os.system`. После этого мы снова запускаем сервер на данном порту с помощью `os.system` и выводим сообщение о успешном запуске.
Если порт не занят‚ мы просто запускаем сервер на данном порту и также выводим сообщение о успешном запуске.Теперь‚ чтобы использовать эту функцию‚ просто вызовите ее‚ передав нужный порт в качестве аргумента. Например⁚
python
start_server(5000)
Эта функция запустит сервер на порту 5000 и‚ если порт уже занят‚ найдет процесс‚ завершит его и попытается запустить сервер еще раз.
Я сам использовал этот подход‚ когда мне нужно было запустить несколько серверов на разных портах‚ и он сработал отлично!