разъем.ошибка: [Errno 48] адрес уже используется

Я пытаюсь настроить сервер с python из Mac terminal.

Я перехожу к местоположению папки использование:

python -m SimpleHTTPServer

но это дает мне ошибку:

socket.error: [Errno 48] Address already in use

ранее я открывал соединение с помощью той же команды на другом сайте в другом месте в моей машине.

8 ответов


у вас уже есть процесс привязан к порту по умолчанию (8000). Если вы уже запускали тот же модуль раньше, скорее всего, этот процесс все еще привязан к порту. Сначала попробуйте найти другой процесс:

$ ps -fA | grep python
  501 81651 12648   0  9:53PM ttys000    0:00.16 python -m SimpleHTTPServer

аргументы команды включены, так что вы можете определить один работает SimpleHTTPServer если более одного python процесс является активным. Вы можете проверить, если http://localhost:8000/ по-прежнему отображается список каталогов для локальных файлов.

второй номер-это процесс номер; остановите сервер, отправив ему сигнал:

kill 81651

это посылает стандартный SIGTERM сигнал; если процесс не отвечает, вам, возможно, придется прибегнуть к более жестким методам, таким как отправка SIGKILL (kill -s KILL <pid> или kill -9 <pid>) вместо сигнала. См.Википедии для более подробной информации.

кроме того, запустите сервер на разные port, указав альтернативный порт в командной строке:

$ python -m SimpleHTTPServer 8910
Serving HTTP on 0.0.0.0 port 8910 ...

затем получить доступ к серверу as http://localhost:8910; где 8910 может быть любое число от 1024 и выше, если порт еще не занят.


простое решение:

  1. найти процесс с помощью port 8080:

    sudo lsof -i:8080

  2. убить его:

    kill XXXX


использовать lsof-i: 5000 Это даст вам список процессов, использующих порт, если таковые имеются. После того, как список процессов задан, используйте идентификатор в столбце PID для завершения процесса: e.G убить 379


кстати, чтобы предотвратить это, в первую очередь, просто нажмите клавишу Ctrl+C в терминале, пока SimpleHTTPServer все еще работает нормально. Это" правильно " остановит сервер и освободит порт, чтобы вам не пришлось снова искать и убивать процесс перед перезапуском сервера.

(Mods: я пытался поставить этот комментарий на лучший ответ, где он принадлежит, но у меня недостаточно репутации.)


вы также можете служить на следующем по высоте доступном порту, делая что-то вроде этого в 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

Если вам нужно сделать то же самое для других утилит, это может быть удобнее, как скрипт bash:

#!/usr/bin/env bash

MIN_PORT=${1:-1025}
MAX_PORT=${2:-65535}

(netstat -atn | awk '{printf "%s\n%s\n", , }' | grep -oE '[0-9]*$'; seq "$MIN_PORT" "$MAX_PORT") | sort -R | head -n 1

настройте это как исполняемый файл с именем get-free-port и вы можете сделать что-то вроде этого:

someprogram --port=$(get-free-port)

это не так надежно, как собственный подход Python, потому что скрипт bash не захватывает порт - другой процесс может захватить порт перед вашим процессом (условие гонки)-но все же может быть достаточно полезен при использовании утилиты, которая не имеет собственного подхода try-try-again.


Я новичок в Python, но после моего короткого исследования я обнаружил, что это типично для привязки сокетов. Так получилось, что сокет все еще используется, и вам, возможно, придется подождать, чтобы использовать его. Или, вы можете просто добавить:

tcpSocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)

это должно сделать порт доступным в течение более короткого времени. В моем случае это сделало порт доступным почти сразу.


У меня есть raspberry pi, и я использую веб-сервер python (используя колбу). Я пробовал все выше, единственное решение -закрыть терминал(корпус) и откройте его снова. Или перезапустите raspberry pi, потому что ничто не мешает, что вебсервер...


на всякий случай выше решения не работали:

  1. получите порт, который прослушивает ваш процесс:

    $ ps ax / grep python

  2. убить процесс

    $ kill PROCESS_NAME