I'm mencoba untuk membuat sebuah server dengan python dari mac terminal.
Aku arahkan ke lokasi folder yang digunakan:
python -m SimpleHTTPServer
Tapi ini memberi saya kesalahan:
socket.error: [Errno 48] Address already in use
Saya sebelumnya telah membuka koneksi dengan menggunakan perintah yang sama untuk situs web yang berbeda di lokasi yang berbeda di mesin saya.
Anda sudah memiliki proses yang terikat ke port default (8000). Jika anda sudah berlari modul yang sama sebelumnya, hal ini kemungkinan besar bahwa proses masih terikat ke pelabuhan. Mencoba dan menemukan proses lainnya terlebih dahulu:
$ ps -fA | grep python
501 81651 12648 0 9:53PM ttys000 0:00.16 python -m SimpleHTTPServer
Perintah argumen yang disertakan, sehingga anda dapat menemukan yang menjalankan SimpleHTTPServer
jika lebih dari satu python
proses aktif. Anda mungkin ingin menguji apakah http://localhost:8000/
masih menampilkan daftar direktori untuk file lokal.
Kedua nomor ini adalah nomor proses; menghentikan server dengan mengirimkan sinyal:
kill 81651
Ini mengirimkan sebuah standar SIGTERM
sinyal; jika proses ini tidak responsif, anda mungkin harus resor untuk metode yang lebih keras seperti mengirimkan SIGKILL
(kill-s MEMBUNUH <pid>
atau kill -9 <pid>
) sinyal sebaliknya. Lihat Wikipedia untuk rincian lebih lanjut.
Atau, menjalankan server di berbagai port, dengan menentukan alternatif port pada baris perintah:
$ python -m SimpleHTTPServer 8910
Serving HTTP on 0.0.0.0 port 8910 ...
kemudian akses server sebagai http://localhost:8910
; di mana 8910
bisa menjadi nomor apapun dari 1024, dan atas, disediakan port tidak sudah diambil.
Gunakan
sudo lsof -i:5000
Ini akan memberikan anda sebuah daftar proses yang menggunakan port jika ada. Setelah daftar dari proses yang diberikan, gunakan id pada kolom PID untuk menghentikan proses menggunakan
kill 379 #use the provided PID
By the way, untuk mencegah hal ini terjadi di tempat pertama, cukup tekan Pilih+C di terminal sementara SimpleHTTPServer masih berjalan normal. Ini akan "benar" menghentikan server dan melepaskan port sehingga anda don't harus menemukan dan membunuh proses lagi sebelum me-restart server.
(Mods: saya tidak mencoba untuk menempatkan komentar ini pada jawaban yang paling tepat di mana ia berasal, tapi aku don't memiliki cukup reputasi.)
Anda juga dapat melayani pada tertinggi berikutnya tersedia port untuk melakukan sesuatu seperti ini di 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
Jika anda perlu untuk melakukan hal yang sama untuk utilitas lain, mungkin akan lebih nyaman sebagai sebuah bash script:
#!/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
Mengaturnya sebagai executable dengan nama mendapatkan-gratis-port
dan anda dapat melakukan sesuatu seperti ini:
someprogram --port=$(get-free-port)
Yang's tidak dapat diandalkan sebagai Python asli untuk mendekati karena bash script doesn't menangkap pelabuhan -- lain proses bisa ambil port sebelum dilakukannya proses (race condition) - tapi masih mungkin cukup berguna ketika menggunakan sebuah utilitas yang doesn't mencoba-mencoba-lagi pendekatan sendiri.
Saya baru Python, tapi setelah saya singkat penelitian saya menemukan bahwa ini adalah khas dari soket yang binded. Itu hanya terjadi bahwa soket masih sedang digunakan dan anda mungkin harus menunggu untuk menggunakannya. Atau, anda hanya dapat menambahkan:
tcpSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
Hal ini seharusnya membuat port yang tersedia dalam waktu yang lebih singkat. Dalam kasus saya, itu membuat port yang tersedia segera.
Sederhana satu baris perintah untuk menyingkirkan itu, ketik perintah di bawah ini di terminal,
ps -a
Ini akan menampilkan semua proses checkout yang sedang digunakan oleh Python dan tipe di bawah perintah di terminal,
kill -9 (processID)
Misalnya kill -9 33178
Saya memiliki raspberry pi, dan saya menggunakan python web server (menggunakan Labu). Saya telah mencoba segala sesuatu di atas, satu-satunya solusi adalah untuk dekat terminal(shell) dan buka lagi. Atau restart raspberry pi, karena tidak ada yang berhenti itu webserver...
Anda dapat mengizinkan server untuk menggunakan kembali sebuah alamat dengan allow_reuse_address
.
Apakah server akan memungkinkan penggunaan kembali sebuah alamat. Ini default untuk
Palsu
, dan dapat diatur dalam subclass untuk mengubah kebijakan.
import SimpleHTTPServer, SocketServer
PORT = 8000
httpd = SocketServer.TCPServer(("", PORT), SimpleHTTPServer.SimpleHTTPRequestHandler)
httpd.allow_reuse_address = True
print "Serving at port", PORT
httpd.serve_forever()