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


96

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

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

Ответы:


120

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

sock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

Странный. Я вызвал это прямо перед привязкой, и ошибка все еще возникает. Я, должно быть, ошибаюсь где-то еще.
byxor

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

Вам необходимо импортировать модуль под названием socket.
Бартош,

32
$ ps -fA | grep python
501 81211 12368   0  10:11PM ttys000    0:03.12  
python -m SimpleHTTPServer

$ kill 81211

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

22

Если вы используете 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)

14

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

некоторое время это происходит, потому что ваша служба не останавливается в стеке процессов. ты должен убить их

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

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

Баш:

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

Рыба:

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

1
Сработало у меня Спасибо!
Код



7

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

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

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


4

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

ps -fA | grep python

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

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

kill -9 pid

0

Получил ту же ошибку:
Выполнены шаги:
1 - использован $ ps -fA | grep python
2 - завершен весь процесс
3 - закрыт терминал
4 - перезапущен и запущено приложение (mkchromecast).
5 - не получил это сообщение об ошибке.

Есть еще одна проблема. отслеживая это.


0

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

fuser -k (port_number_you_are _trying_to_access)/TCP

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.