Sto cercando di impostare un server con python dal terminale del mac.
Navigo nella posizione della cartella e uso:
python -m SimpleHTTPServer
Ma questo mi dà errore:
socket.error: [Errno 48] Address already in use
Avevo precedentemente aperto una connessione usando lo stesso comando per un sito web diverso in una posizione diversa nella mia macchina.
Avete già un processo legato alla porta predefinita (8000). Se avete già eseguito lo stesso modulo prima, è molto probabile che quel processo sia ancora legato alla porta. Prova prima a localizzare l'altro processo:
$ ps -fA | grep python
501 81651 12648 0 9:53PM ttys000 0:00.16 python -m SimpleHTTPServer
Gli argomenti del comando sono inclusi, così puoi individuare quello che esegue SimpleHTTPServer
se più di un processo python
è attivo. Potresti voler testare se http://localhost:8000/
mostra ancora un elenco di directory per i file locali.
Il secondo numero è il numero del processo; ferma il server inviandogli un segnale:
kill 81651
Questo invia un segnale standard SIGTERM
; se il processo non risponde si può ricorrere a metodi più duri come l'invio di un segnale SIGKILL
(kill -s KILL <pid>
o kill -9 <pid>
) invece. Vedere Wikipedia per maggiori dettagli.
In alternativa, esegui il server su una porta diversa, specificando la porta alternativa sulla linea di comando:
$ python -m SimpleHTTPServer 8910
Serving HTTP on 0.0.0.0 port 8910 ...
quindi accedere al server come http://localhost:8910
; dove 8910
può essere qualsiasi numero da 1024 in su, purché la porta non sia già occupata.
Potete anche servire sulla prossima porta disponibile facendo qualcosa del genere in 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
Se avete bisogno di fare la stessa cosa per altre utilità, potrebbe essere più conveniente come uno script 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
Impostatelo come eseguibile con il nome get-free-port
e potrete fare qualcosa del genere:
someprogram --port=$(get-free-port)
Questo non è affidabile come l'approccio nativo di Python perché lo script bash non cattura la porta -- un altro processo potrebbe prendere la porta prima del vostro processo (condizione di gara) -- ma può ancora essere abbastanza utile quando si usa una utility che non ha un approccio try-try-again.