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.
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.
Einfache Lösung:
Finden Sie den Prozess über Port 8080
:
Sudo lsof -i:8080
Töte es:
kill XXXX
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
Ü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.)
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.
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.
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
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 ...
Nur für den Fall, dass oben genannte Lösungen nicht funktionierten:
Erhalten Sie den Port, den Ihr Prozess überwacht:
$ ps Axt | Grep-Python
Töte den Prozess
$ kill PROCESS_NAME