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?

skylerl
źródło

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)
Bartosz
źródło
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
ayoub laaziz
źródło
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}')
MohitGhodasara
źródło
1
Pracował dla mnie Dzięki!
Kod
1
Pracował dla mnie Dzięki
user007
7

Prostym rozwiązaniem, które zadziałało, jest zamknięcie terminala i ponowne uruchomienie.

Siddharth Sethia
źródło
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!

Mirko
źródło
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
Abdul Basit
źródło
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.

silvertech048
źródło
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

Manoj Kumar M
źródło