Python [Errno 98] Adres zaten kullanımda


96

Python soket programımda bazen onu kesmem gerekiyor Ctrl-C. Bunu yaptığımda, kullanarak bağlantıyı kapatıyor socket.close().

Ancak, yeniden açmaya çalıştığımda, tekrar bağlanabilmek için bir dakika kadar beklemem gerekiyor. Bir soket nasıl doğru bir şekilde kapatılır? Yoksa bu kasıtlı mı?

Yanıtlar:


120

Evet, amaçlanmıştır. Burada ayrıntılı açıklamayı okuyabilirsiniz . Bir soket üzerinde SO_REUSEADDR seçeneğini ayarlayarak bu davranışı geçersiz kılmak mümkündür. Örneğin:

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

Garip. Bunu bağlamadan hemen önce aradım ve hata hala devam ediyor. Başka bir yerde hata yapıyor olmalıyım.
byxor

Boşver, otomatik testlerim için ayrı konuları tekrar tekrar bağlarken ve kapatırken tuhaf bir yarış durumu yaşadım.
byxor

Soket adı verilen modülü içe aktarmanız gerekiyor.
Bartosz

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

$ kill 81211

2
Maalesef her zaman işe yaramıyor. Bu sorunla karşılaştığımda aklıma ilk gelen düşünce buydu, ancak benim durumumda öldürmek için hiçbir python işlemi yok.
Kryten

22

SocketServer modülünde bir TCPServer, UDPServer veya bunların alt sınıflarını kullanırsanız, bu sınıf değişkenini ayarlayabilirsiniz (bir sunucuyu anlamadan önce):

SocketServer.TCPServer.allow_reuse_address = True

(üzerinden SocketServer.ThreadingTCPServer - Program yeniden başlatıldıktan sonra adrese bağlanılamıyor )

Bu, init'in (yapıcı) şunları yapmasına neden olur :

 if self.allow_reuse_address:
     self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

14

çünkü zaten çalışmakta olan aynı bağlantı noktasında hizmeti çalıştırmaya çalışıyorsunuz.

hizmetiniz işlem yığınında durdurulmadığı için bir süre olur. onları öldürmek zorundasın

hiçbir şey yüklemeye gerek yokBuraya yok, çalışan tüm python işlemlerini öldürmek için tek satırlık komuttur.

Linux tabanlı işletim sistemi için:

Bash:

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

Balık:

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

1
Benim için çalıştı Teşekkürler!
Kod

1
Benim için çalıştı Teşekkürler
user007


7

Aramadan önce bu komutla bir alt işlem çalıştırmak dışında hiçbir şey işe yaramadı HTTPServer(('', 443), myHandler):

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

Tabii ki bu sadece Linux benzeri işletim sistemi içindir!


4

Öncelikle bu komutu kullanarak python işlem kimliğini bulun

ps -fA | grep python

İkinci sütunda python sürecinizi adlandırarak bir pid numarası alacaksınız.

Ardından bu komutu kullanarak işlemi sonlandırın

kill -9 pid

0

Aynı hatayı aldım: İzlenen
adımlar:
1 - kullanılmış $ ps -fA | grep python
2 - Tüm süreci sonlandırdı
3 - Kapalı terminal
4 - uygulamayı yeniden başlattı ve başlattı (mkchromecast).
5 - bu hata mesajını almadım.

Başka bir sorun var. onu takip ediyor.


0

komutu çalıştır

fuser -k (port_number_you_are _trying_to_access)/TCP

şişe için örnek: fuser -k 5000/tcp

Ayrıca, ctrl + z ile araya girdiğinizde bu hatanın ortaya çıktığını unutmayın. bu yüzden sonlandırmak için ctrl + c kullanın

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.