it-swarm.com.de

socket.error: [Errno 48] Adresse wird bereits verwendet

Ich versuche einen Server mit Python vom Mac-Terminal einzurichten. 

Ich navigiere zu Ordner und Verwendung: 

python -m SimpleHTTPServer

Aber das gibt mir Fehler: 

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

Ich hatte zuvor eine Verbindung mit demselben Befehl Für eine andere Website an einem anderen Ort auf meinem Computer geöffnet.

154
irm

Sie haben bereits einen Prozess, der an den Standardport (8000) gebunden ist. Wenn Sie dasselbe Modul bereits zuvor ausgeführt haben, ist es sehr wahrscheinlich, dass der Prozess noch an den Port gebunden ist. Versuchen Sie, den anderen Prozess zuerst zu lokalisieren:

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

Die Befehlsargumente sind enthalten, sodass Sie das Argument erkennen können, das SimpleHTTPServer ausführt, wenn mehrere python-Prozesse aktiv sind. Möglicherweise möchten Sie testen, ob in http://localhost:8000/ noch eine Verzeichnisliste für lokale Dateien angezeigt wird.

Die zweite Nummer ist die Prozessnummer; Stoppen Sie den Server, indem Sie ein Signal senden:

kill 81651

Dies sendet ein Standardsignal SIGTERM; Wenn der Prozess nicht reagiert, müssen Sie möglicherweise auf härtere Methoden wie das Senden eines SIGKILL (kill -s KILL <pid> oder kill -9 <pid>) Signals zurückgreifen. Siehe Wikipedia für mehr Details .

Alternativ können Sie den Server an einem different - Port ausführen, indem Sie den alternativen Port in der Befehlszeile angeben:

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

greifen Sie dann als http://localhost:8910 auf den Server zu. Dabei kann 8910 eine beliebige Zahl von 1024 und mehr sein, sofern der Port noch nicht belegt ist.

288
Martijn Pieters

Einfache Lösung:

  1. Finden Sie den Prozess über Port 8080:

    Sudo lsof -i:8080

  2. Töte es:

    kill XXXX

95
Snail

Benutzen

 Sudo lsof -i:5000

Dadurch erhalten Sie eine Liste der Prozesse, die den Port verwenden, sofern vorhanden. Wenn die Liste der Prozesse angegeben ist, verwenden Sie die ID in der Spalte "PID", um die Prozessverwendung zu beenden

 kill 379 #use the provided PID
16
candy_man

Übrigens, um dies zu verhindern, drücken Sie einfach Ctrl+C im Terminal, während SimpleHTTPServer noch normal läuft. Dadurch wird der Server "ordnungsgemäß" gestoppt und der Port freigegeben, sodass Sie den Prozess nicht erneut suchen und beenden müssen, bevor Sie den Server neu starten.

(Mods: Ich habe versucht, diesen Kommentar auf die beste Antwort zu setzen, wo er hingehört, aber ich habe nicht genug Ruf.)

12
Mark Chapel

Sie können auch am nächsthöheren verfügbaren Port dienen, indem Sie in Python so etwas tun:

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

Wenn Sie dasselbe für andere Dienstprogramme tun müssen, ist dies möglicherweise einfacher als ein Bash-Skript:

#!/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

Richten Sie das Programm als ausführbare Datei mit dem Namen get-free-port ein, und Sie können Folgendes tun:

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

Das ist nicht so zuverlässig wie der native Python-Ansatz, da das Bash-Skript den Port nicht erfasst - ein anderer Prozess könnte den Port vor dem Prozess übernehmen (Racebedingung) -, kann aber dennoch nützlich sein, wenn ein Dienstprogramm verwendet wird, das nicht funktioniert Es gibt einen eigenen Versuch, sich erneut zu versuchen.

6
Chris Johnson

Ich bin neu in Python, aber nach meiner kurzen Recherche habe ich herausgefunden, dass dies typisch für das Verbinden von Sockeln ist. Es kommt einfach so vor, dass der Sockel noch verwendet wird und Sie möglicherweise warten müssen, um ihn zu verwenden. Oder Sie können einfach hinzufügen:

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

Dadurch sollte der Port in kürzerer Zeit verfügbar sein. In meinem Fall wurde der Port fast sofort verfügbar. 

4
PoisonIvee

Einfacher einzeiliger Befehl, um es loszuwerden, geben Sie den folgenden Befehl in das Terminal ein.

ps -a

Dadurch werden alle Prozesse aufgelistet, checkout, die von Python verwendet werden, und der folgende Befehl wird im Terminal eingegeben.

kill -9 (processID) 

Zum Beispiel töten Sie -9 33178

1
Aditya Malviya

Ich habe einen Raspberry Pi und verwende einen Python-Webserver (mit Flask). Ich habe alles oben versucht, die einzige Lösung besteht darin, das Terminal (Shell) zu schließen und es wieder zu öffnen. Oder Raspberry Pi neu starten, da der Webserver durch nichts angehalten wird ...

1
Thiago Farias

Nur für den Fall, dass oben genannte Lösungen nicht funktionierten:

  1. Erhalten Sie den Port, den Ihr Prozess überwacht:

    $ ps Axt | Grep-Python

  2. Töte den Prozess

    $ kill PROCESS_NAME

0
user3305074