web-dev-qa-db-ja.com

socket.error:[Errno 48]アドレスはすでに使われています

私はMac端末からPythonでサーバーを設定しようとしています。

私はフォルダの場所と用途に移動します。

python -m SimpleHTTPServer

しかし、これは私にエラーを与えます:

socket.error: [Errno 48] Address already in use

以前は自分のマシンの別の場所にある別のWebサイトに対して同じコマンドを使用して接続を開いていました。

173
irm

デフォルトポート(8000)にバインドされたプロセスが既にあります。以前に同じモジュールを実行したことがある場合は、そのプロセスがまだポートにバインドされている可能性があります。最初に他のプロセスを試してみてください。

$ ps -fA | grep python
  501 81651 12648   0  9:53PM ttys000    0:00.16 python -m SimpleHTTPServer

コマンド引数が含まれているので、複数のSimpleHTTPServerプロセスがアクティブな場合は、pythonを実行しているものを見つけることができます。 http://localhost:8000/にまだローカルファイルのディレクトリ一覧が表示されているかどうかをテストすることをお勧めします。

2番目の番号はプロセス番号です。シグナルを送信してサーバーを停止します。

kill 81651

これは標準のSIGTERMシグナルを送ります。プロセスが応答しない場合は、代わりにSIGKILLkill -s KILL <pid>またはkill -9 <pid>)シグナルを送信するなど、もっと難しい方法に頼る必要があるかもしれません。詳しくは ウィキペディアを参照してください

または、コマンドラインで代替ポートを指定して、異なるポートでサーバーを実行します。

$ python -m SimpleHTTPServer 8910
Serving HTTP on 0.0.0.0 port 8910 ...

それからhttp://localhost:8910としてサーバーにアクセスします。ポートがまだ使用されていない場合、8910は1024以上の任意の数字にすることができます。

304
Martijn Pieters

簡単な解決策:

  1. Port 8080を使ってプロセスを見つけます。

    Sudo lsof -i:8080

  2. それを殺します:

    kill XXXX

110
Snail

つかいます

 Sudo lsof -i:5000

これにより、ポートを使用しているプロセスがあればそのリストが表示されます。プロセスのリストが表示されたら、PID列のidを使用してプロセスの使用を終了します

 kill 379 #use the provided PID
22
candy_man

ちなみに、これがそもそも起こらないようにするには、単に押すだけです。 Ctrl+C SimpleHTTPServerがまだ正常に動作している間に端末でこれはサーバを「適切に」停止してポートを解放するので、サーバを再起動する前にプロセスを見つけて強制終了する必要はありません。

(改造:私はそれが属するところで最も良い答えにこのコメントを載せようとしました、しかし私は十分な評判を持っていません。)

12
Mark Chapel

また、次に利用可能なポートでPythonでこのようなことをすることもできます。

import SimpleHTTPServer
import SocketServer

Handler = SimpleHTTPServer.SimpleHTTPRequestHandler

port = 8000
while True:
    try:
        httpd = SocketServer.TCPServer(('', port), Handler)
        print 'Serving on port', port
        httpd.serve_forever()
    except SocketServer.socket.error as exc:
        if exc.args[0] != 48:
            raise
        print 'Port', port, 'already in use'
        port += 1
    else:
        break

他のユーティリティでも同じことをする必要がある場合は、bashスクリプトのほうが便利です。

#!/usr/bin/env bash

MIN_PORT=${1:-1025}
MAX_PORT=${2:-65535}

(netstat -atn | awk '{printf "%s\n%s\n", $4, $4}' | grep -oE '[0-9]*$'; seq "$MIN_PORT" "$MAX_PORT") | sort -R | head -n 1

これをget-free-portという名前の実行ファイルとして設定すれば、次のようなことができます。

someprogram --port=$(get-free-port)

Bashスクリプトがポートをキャプチャしないため、ネイティブのPythonアプローチほど信頼性がありません - プロセスが実行する前に別のプロセスがポートを取得する可能性があります - 独自の試行錯誤アプローチがあります。

6
Chris Johnson

私はPythonに慣れていませんが、私の簡単な調査の結果、これはソケットが束縛されている典型的なものであることがわかりました。ソケットがまだ使用されていて、使用するのを待つ必要があるかもしれません。または、単に追加することもできます。

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

これにより、ポートが短時間で使用可能になります。私の場合は、すぐに利用できるようになりました。

5
PoisonIvee

それを取り除くための簡単な一行コマンド、ターミナルで下記のコマンドを入力してください、

ps -a

これはすべてのプロセスを一覧表示し、Pythonで使用されているチェックアウトと端末でbellowコマンドを入力します。

kill -9 (processID) 

たとえば、kill -9 33178

2
A H M

私はラズベリーパイを持っています、そして私は(Flaskを使って)pythonウェブサーバを使っています。私は上記のすべてを試してみました、唯一の解決策は端末を閉じ(Shell)そしてそれを再び開くことです。またはRaspberry Piを再起動します.

2
Thiago Farias

念のため上記の解決策がうまくいかなかった場合

  1. プロセスが待機しているポートを取得します。

    $ ps ax | grep python

  2. プロセスを殺す

    PROCESS_NAMEを強制終了

1
user3305074