Python [Errno 98]アドレスはすでに使用されています


91

私のPythonソケットプログラムでは、で中断する必要がある場合がありCtrl-Cます。これを行うと、を使用して接続が閉じsocket.close()ます。

しかし、それを再度開こうとすると、再び接続できるようになるまでに1分間かかるように見えます。ソケットを正しく閉じるにはどうすればよいですか?それともこれは意図されていますか?

回答:


115

はい、それは意図されています。ここで詳細な説明を読むことができます。ソケットにSO_REUSEADDRオプションを設定することにより、この動作をオーバーライドすることが可能です。例えば:

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

奇妙な。バインドする直前にこれを呼び出しましたが、まだエラーが発生しています。私はどこかで間違いをしているに違いありません。
byxor 2017

気にしないでください。自動テストのために別々のスレッドで繰り返しバインドおよびシャットダウンすると、奇妙な競合状態が発生しました。
byxor 2017

ソケットと呼ばれるモジュールをインポートする必要があります。
Bartosz

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

$ kill 81211

1
残念ながら、それは常に機能するとは限りません。私がこの問題に遭遇したとき、これは私の直接の考えでしたが、私の場合、殺すpythonプロセスはありません。
Kryten

20

SocketServerモジュールでTCPServer、UDPServer、またはそれらのサブクラスを使用する場合、(サーバーをインスタンス化する前に)このクラス変数を設定できます。

SocketServer.TCPServer.allow_reuse_address = True

SocketServer.ThreadingTCPServer経由-プログラムの再起動後にアドレスにバインドできません

これにより、init(コンストラクタ)は次のことを行います。

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

12

すでに実行されているのと同じポートでサービスを実行しようとしているためです。

サービスがプロセススタックで停止していないために、いつか発生します。あなたはそれらを殺さなければなりません

ここに何もインストールする必要はありませんが、実行中のすべてのPythonプロセスを強制終了する1行のコマンドです。

LinuxベースのOSの場合:

バッシュ:

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

魚:

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

1
ありがとうございます!
コード

1
ありがとうございました
user007

6

を呼び出す前に、このコマンドでサブプロセスを実行する以外は何も機能しませんでしたHTTPServer(('', 443), myHandler)

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

もちろん、これはLinuxライクなOS専用です!



4

まず、このコマンドを使用してpythonプロセスIDを見つけます

ps -fA | grep python

あなたは2列目に Pythonプロセスの名前を付けることによってpid番号を取得します

次に、このコマンドを使用してプロセスを強制終了します

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を使用します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.