Poskušam vzpostaviti strežnik s pythonom iz terminala mac.
Navigiram se do lokacije mape in uporabim:
python -m SimpleHTTPServer
Toda to mi da napako:
socket.error: [Errno 48] Address already in use
Pred tem sem odprl povezavo z istim ukazom za drugo spletno stran na drugem mestu v mojem računalniku.
Na privzeta vrata (8000) je že vezan proces. Če ste že prej zagnali isti modul, je najverjetneje ta proces še vedno vezan na ta vrata. Najprej poskusite poiskati drugi proces:
$ ps -fA | grep python
501 81651 12648 0 9:53PM ttys000 0:00.16 python -m SimpleHTTPServer
Argumenti ukaza so vključeni, tako da lahko odkrijete tistega, ki izvaja SimpleHTTPServer
, če je aktivnih več kot en proces python
. Morda boste želeli preveriti, ali http://localhost:8000/
še vedno prikazuje seznam imenikov za lokalne datoteke.
Druga številka je številka procesa; zaustavite strežnik tako, da mu pošljete signal:
kill 81651
To pošlje standardni signal SIGTERM
; če se proces ne odziva, boste morda morali namesto tega uporabiti strožje metode, kot je pošiljanje signala SIGKILL
(kill -s KILL <pid>
ali kill -9 <pid>
). Za več podrobnosti glej Wikipedija.
Strežnik lahko zaženete tudi na različnih vratih, tako da v ukazni vrstici navedete alternativna vrata:
$ python -m SimpleHTTPServer 8910
Serving HTTP on 0.0.0.0 port 8910 ...
nato dostopajte do strežnika kot http://localhost:8910
; kjer je 8910
lahko katero koli število od 1024 naprej, če vrata še niso zasedena.
Enostavna rešitev:
8080
:`sudo lsof -i:8080`
XXXX` `kill XXXX`
V Pythonu lahko uporabite tudi naslednja najvišja razpoložljiva vrata, če naredite nekaj podobnega:
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
Če morate enako narediti za druge pripomočke, bo morda bolj priročno uporabiti skripto 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
To nastavite kot izvršilni program z imenom get-free-port
in lahko naredite nekaj takega:
someprogram --port=$(get-free-port)
To ni tako zanesljivo kot izvirni pristop Pythona, ker skripta bash ne zajame vrat - drug proces lahko zajame vrata pred vašim procesom (race condition) - vendar je lahko še vedno dovolj uporabno, če uporabljate orodje, ki nima lastnega pristopa try-try-again.