Python [Errno 98] Adres jest już używany


96

W moim programie używającym gniazd w Pythonie czasami muszę go przerwać za pomocą Ctrl-C. Kiedy to robię, zamyka połączenie za pomocą socket.close().

Jednak kiedy próbuję go ponownie otworzyć, muszę poczekać, co wydaje się minutę, zanim będę mógł ponownie się połączyć. Jak prawidłowo zamknąć gniazdo? Czy jest to zamierzone?

Odpowiedzi:


120

Tak, jest przeznaczony. Tutaj możesz przeczytać szczegółowe wyjaśnienie . Można zmienić to zachowanie, ustawiając opcję SO_REUSEADDR w gnieździe. Na przykład:

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

Dziwne. Nazwałem to tuż przed wiązaniem, a błąd nadal występuje. Muszę popełniać błąd gdzie indziej.
byxor

Nieważne, miałem dziwny stan wyścigu, gdy wielokrotnie wiązałem i wyłączałem w oddzielnych wątkach dla moich automatycznych testów.
byxor

Musisz zaimportować moduł o nazwie socket.
Bartosz

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

$ kill 81211

2
Niestety nie zawsze to działa. To była moja natychmiastowa myśl, kiedy napotkałem ten problem, ale w moim przypadku nie ma procesu Pythona do zabicia.
Kryten,


14

ponieważ próbujesz uruchomić usługę w tym samym porcie, który już działa.

czasami zdarza się, ponieważ twoja usługa nie jest zatrzymana w stosie procesów. musisz ich zabić

nie trzeba tu niczego instalować , to jedno wierszowe polecenie, które zabije wszystkie uruchomione procesy Pythona.

dla systemu operacyjnego opartego na systemie Linux:

Grzmotnąć:

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

Ryba:

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

1
Pracował dla mnie Dzięki!
Kod

1
Pracował dla mnie Dzięki
user007


7

Nic nie działało dla mnie poza uruchomieniem podprocesu za pomocą tego polecenia przed wywołaniem HTTPServer(('', 443), myHandler):

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

Oczywiście dotyczy to tylko systemu operacyjnego podobnego do linuxa!


4

Przede wszystkim znajdź identyfikator procesu Pythona za pomocą tego polecenia

ps -fA | grep python

Numer pid otrzymasz, nadając nazwę procesowi Pythona w drugiej kolumnie

Następnie zakończ proces za pomocą tego polecenia

kill -9 pid

0

Wystąpił ten sam błąd: Wykonane
kroki:
1 - używane $ ps -fA | grep python
2 - Zabito cały proces
3 - Zamknięty terminal
4 - uruchomiono ponownie i uruchomiono aplikację (mkchromecast).
5 - nie otrzymałem tego komunikatu o błędzie.

Mam inny problem. kontynuowanie tego.


0

uruchom polecenie

fuser -k (port_number_you_are _trying_to_access)/TCP

przykład dla kolby: fuser -k 5000/tcp

Pamiętaj też, że ten błąd pojawia się podczas wstawiania przez ctrl + z. więc aby zakończyć, użyj ctrl + c

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.