310 votes

Socket.error: [Errno 48] Adresse déjà utilisée

Je tente de configurer un serveur avec python depuis le terminal mac.

Je me déplace vers l'emplacement du dossier et utilise:

python -m SimpleHTTPServer

Mais cela me donne une erreur:

socket.error: [Errno 48] Adresse déjà utilisée

J'avais précédemment ouvert une connexion en utilisant la même commande pour un site web différent situé dans un endroit différent de ma machine.

11voto

Michael Schmid Points 25

Vous pouvez autoriser le serveur à réutiliser une adresse avec allow_reuse_address.

Si le serveur autorisera la réutilisation d'une adresse. Cela est par défaut False, et peut être défini dans les sous-classes pour modifier la politique.

import SimpleHTTPServer, SocketServer
PORT = 8000
httpd = SocketServer.TCPServer(("", PORT), SimpleHTTPServer.SimpleHTTPRequestHandler)
httpd.allow_reuse_address = True
print "En cours de service au port", PORT
httpd.serve_forever()

8voto

Chris Johnson Points 2887

Vous pouvez également servir sur le port disponible juste supérieur en faisant quelque chose comme ceci en Python:

import SimpleHTTPServer
import SocketServer

Handler = SimpleHTTPServer.SimpleHTTPRequestHandler

port = 8000
while True:
    try:
        httpd = SocketServer.TCPServer(('', port), Handler)
        print 'Servir sur le port', port
        httpd.serve_forever()
    except SocketServer.socket.error as exc:
        if exc.args[0] != 48:
            raise
        print 'Le port', port, 'est déjà utilisé'
        port += 1
    else:
        break

Si vous devez faire la même chose pour d'autres utilitaires, cela peut être plus pratique en tant que 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

Configurez-le en tant qu'exécutable avec le nom get-free-port et vous pouvez faire quelque chose comme ceci:

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

Ce n'est pas aussi fiable que l'approche native Python car le script bash ne capture pas le port -- un autre processus pourrait saisir le port avant que votre processus ne le fasse (condition de concurrence) -- mais cela peut toujours être suffisamment utile lors de l'utilisation d'un utilitaire qui n'a pas sa propre approche de réessai.

7voto

PoisonIvee Points 81

Je suis nouveau en Python, mais après mes recherches rapides, j'ai découvert que cela est typique des sockets étant liés. Il se trouve simplement que le socket est encore utilisé et vous devrez peut-être attendre pour l'utiliser. Ou, vous pouvez simplement ajouter :

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

Cela devrait rendre le port disponible plus rapidement. Dans mon cas, cela a rendu le port disponible presque immédiatement.

6voto

Genius Points 1104

Étui avec moi

Cela se produit lorsque je débogue ou exécute un serveur et une fois terminé, au lieu de Terminer le processus, je le Déconnecte.

PyCharm demande ces deux options lorsque nous essayons de le fermer alors que le serveur est encore en cours d'exécution

Cela fait que le processus continue de fonctionner en arrière-plan à cette adresse particulière, d'où l'erreur Adresse déjà utilisée.

Solution

pkill python

Fonctionne pour moi.

Un autre cas - Processus multiples

Si vous avez plus d'un serveur/application fonctionnant avec python (évidemment, sur des ports différents), alors obtenez le PID de ce processus en utilisant le PORT et tuez le.

sudo lsof -i :5000 # ici 5000 est le numéro de port  

| COMMANDE | PID    | UTILISATEUR | FD | TYPE | DEVICE | TAILLE/OFF | NOEUD | NOM                    |
|---------|--------|----------|----|------|--------|----------|------|-------------------------|
| python  | 185339 | nom d'utilisateur | 7u | IPv4 | 598745 | 0t0      | TCP  | localhost:5000 (LISTEN) |
| python  | 185348 | nom d'utilisateur | 7u | IPv4 | 598745 | 0t0      | TCP  | localhost:5000 (LISTEN) |
| python  | 185350 | nom d'utilisateur | 8u | IPv4 | 598745 | 0t0      | TCP  | localhost:5000 (LISTEN) |

kill -9 185339 # ici 185339 est le PID à partir de la sortie ci-dessus ; gardez le -9 tel quel

Vérifiez la réponse de @Andrew pour éviter cela à l'avenir.

Références : commande kill, kill/pkill/killall, lsof

Namaste

5voto

user3305074 Points 32

Si les solutions ci-dessus ne fonctionnent pas:

  1. Obtenez le port sur lequel votre processus écoute:

    $ ps ax | grep python

  2. Arrêtez le processus

    $ kill PROCESS_NAME

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X