2016-11-03 5 views
0

Je travaille en fonction de l'exemple « Bonjour tout le monde » de bouteille, qui peut être trouvé ici: https://bottlepy.org/docs/dev/tutorial.htmlComment faire pour que Bottle renvoie une erreur si un port est déjà écouté?

from bottle import Bottle, run 

app = Bottle() 

@app.route('/hello') 
def hello(): 
    return "Hello World!" 

run(app, host='localhost', port=8080) 

Mon problème est que ce code peut être exécuté plusieurs fois et seule la première instance sera la l'un fait réellement le service. Est-il possible de renvoyer une erreur au programme pour indiquer que le port est déjà écouté?

+0

Petite suggestion: 'return [" Hello World! "]' Au lieu de 'return" Hello World! "' –

+0

@ ron.rothman - Je viens de copier l'exemple. Pourquoi retourner une table mieux ici? – rbrtk

+0

https://github.com/PerimeterX/perimeterx-python-wsgi/issues/1 –

Répondre

0

Vérification rapide et sale pour voir si un port est ouvert avant d'exécuter votre application de bouteille pourrait être utile.

import socket 

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

try: 
    s.bind(("127.0.0.1", 8000)) 
s.close() 

code ci-dessus va essayer de se lier sur localhost et à la prise 8000 échouera si la prise est déjà utilisé une erreur de retour 48Address already in use. Si elle réussit alors il fermera le port (unbind) 8000.

+0

C'est une solution simple, mais je suis allé avec celui-ci. Merci. :) – rbrtk

0

Choisissez un port libre d'abord:

s.bind("127.0.0.1", 0) 
free_port = sock.getsockname()[1] 
s.close() 

Ceci est sujette à une condition de course, mais il est moins susceptible de frapper que si vous liez à 8000 d'abord, puis fermez.

0

Juste attraper l'erreur:

L'exécution de ce lorsque le port est déjà lié des rendements

> python test.py 
Bottle v0.12.8 server starting up (using WSGIRefServer())... 
Listening on http://localhost:8080/ 
Hit Ctrl-C to quit. 

run exited: [Errno 48] Address already in use 

Bien que je l'avoue n'est pas clair pour moi pourquoi vous voulez imprimer l'erreur vous-même lorsque la trace de la pile que vous obtenez déjà fait essentiellement la même chose. Dans tous les cas, ce qui précède devrait fonctionner. J'espère que cela pourra aider!

+0

C'est le problème - il n'y a pas d'erreur si vous exécutez plusieurs instances. Au moins, je n'en ai pas. :) – rbrtk