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)

13

тому що ви намагаєтеся запустити службу в тому самому порту, який уже запущений.

деякий час це трапляється, тому що ваша служба не зупиняється в стеку процесів. ви повинні їх вбити

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

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

Баш:

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

Риба:

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

1
Працював у мене Дякую!
Код

1
Працював у мене Дякую
user007

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.