J'essaie de configurer un serveur avec Python à partir du terminal Mac.
Je navigue vers l'emplacement du dossier pour une utilisation:
python -m SimpleHTTPServer
Mais cela me donne une erreur:
socket.error: [Errno 48] Address already in use
J'avais précédemment ouvert une connexion en utilisant la même commande Pour un site Web différent à un emplacement différent de ma machine.
Vous avez déjà un processus lié au port par défaut (8000). Si vous avez déjà exécuté le même module auparavant, il est fort probable que ce processus reste lié au port. Essayez de localiser d’abord l’autre processus:
$ ps -fA | grep python
501 81651 12648 0 9:53PM ttys000 0:00.16 python -m SimpleHTTPServer
Les arguments de commande sont inclus, vous pouvez donc repérer celui qui exécute SimpleHTTPServer
si plusieurs processus python
sont actifs. Vous voudrez peut-être vérifier si http://localhost:8000/
affiche toujours une liste de répertoires pour les fichiers locaux.
Le deuxième numéro est le numéro de processus; arrêtez le serveur en lui envoyant un signal:
kill 81651
Cela envoie un signal SIGTERM
standard; si le processus ne répond pas, vous devrez peut-être recourir à des méthodes plus rigoureuses, telles que l'envoi d'un signal SIGKILL
(kill -s KILL <pid>
ou kill -9 <pid>
). Voir Wikipedia pour plus de détails .
Vous pouvez également exécuter le serveur sur un port différent en spécifiant le port de remplacement sur la ligne de commande:
$ python -m SimpleHTTPServer 8910
Serving HTTP on 0.0.0.0 port 8910 ...
puis accédez au serveur en tant que http://localhost:8910
; où 8910
peut être n'importe quel nombre à partir de 1024, à condition que le port ne soit pas déjà utilisé.
Solution simple:
Trouvez le processus en utilisant le port 8080
:
Sudo lsof -i:8080
Tue le:
kill XXXX
Utilisation
Sudo lsof -i:5000
Cela vous donnera une liste de processus utilisant le port, le cas échéant. Une fois que la liste des processus est fournie, utilisez l'ID de la colonne PID pour mettre fin au processus
kill 379 #use the provided PID
À propos, pour éviter que cela ne se produise, appuyez simplement sur Ctrl+C dans le terminal alors que SimpleHTTPServer fonctionne toujours normalement. Cela arrêtera "correctement" le serveur et libérera le port afin que vous n'ayez plus à rechercher et à tuer le processus avant de redémarrer le serveur.
(Mods: J'ai essayé de mettre ce commentaire sur la meilleure réponse, mais je n'ai pas assez de réputation.)
Vous pouvez également servir sur le port disponible suivant 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 '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
Si vous avez besoin de faire la même chose pour d'autres utilitaires, cela peut être plus pratique comme 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
Définissez-le comme un exécutable avec le nom get-free-port
et vous pouvez faire quelque chose comme ceci:
someprogram --port=$(get-free-port)
Cela n’est pas aussi fiable que l’approche Python native car le script bash ne capture pas le port - un autre processus pourrait le saisir avant votre processus (condition de concurrence) - mais peut néanmoins être suffisamment utile lorsqu’un utilitaire qui ne fonctionne t avoir une approche d’essayer encore une fois.
Je suis nouveau sur Python, mais après une brève recherche, j'ai découvert que c'était typique des sockets liés. Il se trouve que le socket est toujours utilisé et que 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 dans un délai plus court. Dans mon cas, cela a rendu le port disponible presque immédiatement.
Commande simple en une ligne pour s'en débarrasser, tapez ci-dessous la commande dans le terminal,
ps -a
Ceci listera tous les processus, la caisse utilisée par Python et la commande type ci-dessous dans le terminal,
kill -9 (processID)
Par exemple, kill -9 33178
J'ai un Raspberry Pi et j'utilise un serveur Web Python (en utilisant Flask). J'ai tout essayé ci-dessus, la seule solution est de fermer le terminal (Shell) et l'ouvrir à nouveau. Ou redémarrez le Raspberry Pi , car rien n'arrête ce serveur web ...
Juste au cas où les solutions ci-dessus ne fonctionneraient pas:
Obtenez le port que votre processus écoute:
$ ps ax | grep python
Tuez le processus
$ kill PROCESS_NAME