Python [Errno 98] Адрес уже используется

В моей программе сокета Python мне иногда нужно прервать ее с помощью Ctrl-C. Когда я это делаю, он закрывает соединение с помощью socket.close().

Однако, когда я пытаюсь открыть его снова, мне приходится ждать, кажется, минуту, прежде чем я снова смогу подключиться. Как правильно закрыть розетку? Или это задумано?


person skylerl    schedule 16.12.2010    source источник


Ответы (11)


Да, это задумано. Здесь вы можете прочитать подробное объяснение. Это поведение можно изменить, установив опцию SO_REUSEADDR для сокета. Например:

sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
person Bartosz    schedule 16.12.2010
comment
Странный. Я вызвал это прямо перед привязкой, но ошибка все еще возникает. Я, должно быть, ошибаюсь где-то еще. - person byxor; 08.02.2017
comment
Неважно, у меня было странное состояние гонки, когда я неоднократно связывал и завершал отдельные потоки для моих автоматических тестов. - person byxor; 08.02.2017
comment
Вам необходимо импортировать модуль под названием socket. - person Bartosz; 16.06.2020
comment
ВАЖНОЕ ПРИМЕЧАНИЕ: sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) работает, НО вы должны использовать это сразу после создания сокета. Не будет работать после .bind()! - person vlad-ardelean; 26.06.2021

Это происходит из-за того, что вы пытаетесь запустить службу на том же порту, а приложение уже запущено. это может произойти, потому что ваша служба не остановлена ​​в стеке процессов. вам просто нужно убить эти процессы.

Нет необходимости устанавливать что-либо, это однострочная команда, которая убивает все запущенные процессы Python.

для ОС на базе Linux:

Баш:

kill -9 $(ps -A | grep python | awk '{print $1}')

Рыбы:

kill -9 (ps -A | grep python | awk '{print $1}')
person MohitGhodasara    schedule 25.01.2019

Если вы используете TCPServer, UDPServer или их подклассы в модуле SocketServer, вы можете установить эту переменную класса (до создания экземпляра сервера):

SocketServer.TCPServer.allow_reuse_address = True

(через SocketServer.ThreadingTCPServer - Невозможно привязать к адресу после перезапуска программы < / а>)

Это заставляет init (конструктор):

 if self.allow_reuse_address:
     self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
person dirkk0    schedule 27.08.2014

У меня сработало простое решение - закрыть Терминал и перезапустить его.

person Siddharth Sethia    schedule 15.07.2018

У меня ничего не работало, кроме запуска подпроцесса с помощью этой команды перед вызовом HTTPServer(('', 443), myHandler):

kill -9 $(lsof -ti tcp:443)

Конечно, это только для Linux-подобных ОС!

person Mirko    schedule 22.05.2017

Прежде всего найдите идентификатор процесса python с помощью этой команды

ps -fA | grep python

Вы получите номер pid, указав свой процесс Python в втором столбце.

Затем убейте процесс с помощью этой команды

kill -9 pid
person Abdul Basit    schedule 28.04.2020

запустите команду

fuser -k (port_number_you_are _trying_to_access)/TCP

пример для колбы: fuser -k 5000/tcp

Также помните, что эта ошибка возникает при вводе клавиш ctrl + z. поэтому для завершения используйте ctrl + c

person Manoj Kumar M    schedule 04.03.2020
comment
Это не совсем работает, если процесс, который использовал этот порт, уже мертв: q - person SasQ; 28.03.2021

У меня была такая же проблема (адрес Err98 уже используется) на Raspberry Pi, на котором запущен питон для диспетчера зарядки электромобилей для настенного разъема Tesla. Программное обеспечение раньше было в порядке, но однажды оно перестало опрашивать солнечный инвертор, и я целыми днями думал, что это то, что я сделал на питоне. Оказывается, основная причина заключалась в том, что модем Wi-Fi назначил новый динамический IP-адрес солнечному инвертору в результате внедрения нового смарт-телевизора в мой дом. Я изменил код Python, чтобы отразить новый IP-адрес, который я нашел от модема Wi-Fi и бинго, проблема была исправлена.

person Bernie Grealy    schedule 31.05.2021

Я столкнулся с аналогичной ошибкой на сервере odoo и решил ее с помощью следующих простых шагов:

  1. Вставьте следующий код в терминал

    ps -fA | grep python

Вы получите номер pid. Теперь скопируйте номер pid из второго столбца вывода терминала.

  1. Затем напишите, как показано ниже

    kill -9 pid

Терминал перезагрузится, а затем команда

flask run

Будет работать нормально! Спасибо

person Abdul Hameed    schedule 02.06.2021

sudo pkill -9 питон

попробуйте эту команду

person Sahil Rajput    schedule 27.05.2021
comment
Несмотря на то, что это технически возможное решение проблемы, я не думаю, что просто убить все процессы python - хорошая идея. Что делать, если у вас есть другие процессы, которым для правильной работы нужен Python? Вы бы убили их всех. - person bastantoine; 27.05.2021

person    schedule
comment
К сожалению, это не всегда срабатывает. Это было моей непосредственной мыслью, когда я столкнулся с этой проблемой, но в моем случае нет процесса python, который нужно убить. - person Kryten; 18.12.2016