2010-03-01 3 views
4

J'ai un code similaire à ce qui suit en cours d'exécution dans un script:Python: la longueur du délai de contrôle

try: 
    s = ftplib.FTP('xxx.xxx.xxx.xxx','username','password') 

except: 
    print ('Could not contact FTP serer') 
    sys.exit() 

Si le site FTP est inaccessible, le script semble presque « blocage » ... Il prend environ 75 secondes en moyenne avant que sys.exit() ne soit appelé ... Je sais que les 75 secondes sont probablement très subjectives, et dépendent du système sur lequel il s'exécute ... mais y a-t-il un moyen de faire essayer Python une fois, et si sans succès, pour sortir immédiatement? La plate-forme que j'utilise pour cela est Mac OS X 10.5/python 2.5.1.

Répondre

7

A partir de 2.6, le FTP constructor a un paramètre timeout en option:

class ftplib.FTP([host[, user[, passwd[, acct[, timeout]]]]])

Retour une nouvelle instance de la classe FTP. Lorsque host est donné, l'appel de méthode connect (host) est fait. Lorsque l'utilisateur est donné, en plus le login d'appel de méthode (user, passwd, acct) est fait (où passwd et acct par défaut à la chaîne vide quand il n'est pas donné). Le paramètre facultatif timeout spécifie un délai d'attente en secondes pour les opérations de blocage comme la tentative de connexion (si ce paramètre n'est pas spécifié, le paramètre de délai d'expiration global par défaut sera utilisé).

Modifié dans la version 2.6: le délai a été ajouté.

partir de la version 2.3 et plus, le délai d'attente par défaut global peut être utilisé:

socket.setdefaulttimeout(timeout)

Définissez le délai d'attente par défaut en floating secondes pour les nouveaux objets socket. Une valeur de None indique que les nouveaux objets socket n'ont aucun délai. Lorsque le module de socket est importé pour la première fois, la valeur par défaut est None.

Nouveauté 2.3.

+0

Merci, comme @SilentGhost mentionné ... J'utilise 2.5.1 ....Un peu verrouillé car toutes les machines clientes exécutent Mac OS X 10.5 .. et ne peuvent pas toucher la version installée de python – cit

+0

Heureusement pour vous, avec 2.3 et plus, vous pouvez définir un délai global de socket. – gimel

1

si vous regardez le doc, il y a un paramètre de délai d'attente.

class ftplib.FTP([host[, user[, passwd[, acct[, timeout]]]]])¶

vous pouvez peut-être utiliser.

+1

c'est la fonction python 2.6, OP utilise py2.5.1 – SilentGhost

2

puisque vous êtes sur Python 2.5, vous pouvez définir un délai global pour toutes les opérations de socket (y compris les requêtes FTP) en utilisant:

socket.setdefaulttimeout() 

(cela a été ajouté en Python 2.3)

1

Un commentaire à ceux qui suggèrent d'utiliser 'socket.setdefaulttimeout()'. En interne, ftplib utilise sock.makefile(). D'après les docs python, vous ne devriez pas mélanger makefile() avec les timeouts. Plus précisément: http://docs.python.org/library/socket.html#socket.socket.makefile

Bien sûr, je ne peux pas dire que j'ai vu des problèmes, c'est juste que ça m'inquiète.

Questions connexes