Ich versuche, einen Server mit Python vom Mac-Terminal aus einzurichten.
Ich navigiere zum Ordner und verwende ihn:
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.
python -m SimpleHTTPServer 8081
Antworten:
Sie haben bereits einen Prozess an den Standardport (8000) gebunden. Wenn Sie bereits zuvor dasselbe Modul ausgeführt haben, ist der Prozess höchstwahrscheinlich immer noch an den Port gebunden. Versuchen Sie zuerst, den anderen Prozess zu finden:
Die Befehlsargumente sind enthalten, sodass Sie das laufende erkennen können,
SimpleHTTPServer
wenn mehr als einpython
Prozess aktiv ist. Möglicherweise möchten Sie testen, obhttp://localhost:8000/
noch eine Verzeichnisliste für lokale Dateien angezeigt wird .Die zweite Nummer ist die Prozessnummer. Stoppen Sie den Server, indem Sie ihm ein Signal senden:
Dies sendet ein Standardsignal
SIGTERM
; Wenn der Prozess nicht reagiert, müssen Sie möglicherweise auf härtere Methoden wie das Senden einesSIGKILL
(kill -s KILL <pid>
oderkill -9 <pid>
) Signals zurückgreifen . Siehe Wikipedia für weitere Details .Alternativ können Sie den Server an einem anderen Port ausführen , indem Sie den alternativen Port in der Befehlszeile angeben:
dann auf den Server zugreifen als
http://localhost:8910
; Wo8910
kann eine beliebige Nummer ab 1024 sein, vorausgesetzt, der Port ist noch nicht belegt.quelle
sudo kill -9 PID
kill
Sendet ein Signal an den Prozess, das er verarbeiten kann (z. B. ordnungsgemäßes Herunterfahren oder Drehen einer Protokolldatei). Diese Signale sind Ganzzahlen (jeweils mit einem Namen), wobei der Standardwert 15 ist, was bedeutetTERM
oder endet . Die Verwendung von -9 sendet das Signal 9,KILL
das ein Prozess nicht abfangen und ignorieren kann, und das Betriebssystem beendet den Prozess, ob es möchte oder nicht.Einfache Lösung:
Finden Sie den Prozess über Port
8080
:sudo lsof -i:8080
Töte es:
kill XXXX
quelle
lsof
Ausgabe aussehen könnte und wie die Prozess-ID (das von Ihnen aufgelistete "XXXX") in der Ausgabe gefunden wird. Für alle, die dies ohne diese Informationen sehen, ist es das zweite Feld in der Ausgabe unter der Überschriftenbezeichnung "PID".Verwenden
Dadurch erhalten Sie eine Liste der Prozesse, die den Port verwenden, falls vorhanden. Wenn die Liste der Prozesse angegeben ist, verwenden Sie die ID in der PID-Spalte, um die Prozessverwendung zu beenden
quelle
Übrigens, um dies zu verhindern, drücken Sie einfach Ctrl+ Cim 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 sie hingehört, aber ich habe nicht genug Ruf.)
quelle
Einfacher einzeiliger Befehl, um ihn loszuwerden. Geben Sie den folgenden Befehl in das Terminal ein.
Dadurch werden alle Prozesse aufgelistet, die von Python verwendet werden, und der folgende Befehl wird in das Terminal eingegeben.
Zum Beispiel töte -9 33178
quelle
Sie können auch auf dem nächsthöheren verfügbaren Port arbeiten und in Python Folgendes tun:
Wenn Sie dasselbe für andere Dienstprogramme tun müssen, ist dies möglicherweise praktischer als ein Bash-Skript:
Wenn Sie das als ausführbare Datei mit dem Namen
get-free-port
einrichten, können Sie Folgendes tun:Dies 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 Ihrem Prozess abrufen (Race-Bedingung) -, aber dennoch nützlich genug sein kann, wenn Sie ein Dienstprogramm verwenden, das dies nicht tut. Ich habe keinen eigenen Versuch, es noch einmal zu versuchen.
quelle
Ich bin neu in Python, aber nach meiner kurzen Recherche habe ich herausgefunden, dass dies typisch für das Binden von Sockets ist. Es kommt einfach so vor, dass der Socket noch verwendet wird und Sie möglicherweise warten müssen, um ihn zu verwenden. Oder Sie können einfach hinzufügen:
Dies sollte den Port in kürzerer Zeit verfügbar machen. In meinem Fall wurde der Port fast sofort verfügbar.
quelle
Nur für den Fall, dass die oben genannten Lösungen nicht funktionieren:
Holen Sie sich den Port, den Ihr Prozess abhört:
$ ps ax | Grep Python
Töte den Prozess
$ kill PROCESS_NAME
quelle
Ich habe einen Himbeer-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 wieder zu öffnen. Oder starten Sie den Himbeer-Pi neu , weil nichts diesen Webserver aufhält ...
quelle
Sie können dem Server erlauben, eine Adresse mit wiederzuverwenden
allow_reuse_address
.quelle