Je rencontre un problème avec la tentative de déclaration d'un objet ftp global. Je veux que la connexion ftp soit vérifiée à certains moments et rafraîchie ou reconnectée. J'essaie d'utiliser une variable globale, car je veux détecter les erreurs dans une autre fonction.
J'ai essayé de mettre le «ftp global» partout, et cela ne semble aider nulle part. J'ai le sentiment que cela a quelque chose à voir avec le fait que FTP(ftpIP)
renvoie une nouvelle instance de la classe ftp à chaque appel, mais je ne suis pas sûr. Ou n'est-il pas possible de déclarer un objet global?
def ftpKeepAlive():
global ftp
# Keep FTP alive
ftp.voidcmd('NOOP') # Send a 'NOOP' command every 30 seconds
def ftpConnect():
try:
ftp = FTP(ftpIP) # This times out after 20 sec
ftp.login(XXXXX)
ftp.cwd(ftpDirectory)
ftp_status = 1
except Exception, e:
print str(e)
ftp_status = 0
pass
# Initialize FTP
ftpIP = '8.8.8.8' # ftp will fail on this IP
ftp_status = 0
global ftp
ftpConnect()
while (1):
if (second == 30):
global ftp
ftpKeepAlive()
3 réponses
Le problème est que vous le définissez dans autant d'endroits, mais vous ne l'initialisez pas comme nécessaire. Essayez de le définir une seule fois et assurez-vous de l'initialiser avant d'essayer de l'utiliser.
Le code ci-dessous entraîne la même erreur NameError:
global ftp
ftp.voidcmd('NOOP')
Mais le code ci-dessous entraîne une erreur de connexion (comme prévu):
from ftplib import *
global ftp
ftp = FTP('127.0.0.1')
ftp.voidcmd('NOOP')
J'ai apporté quelques ajustements à votre code pour le rapprocher de ce que je veux dire. C'est ici:
from ftplib import *
global ftp
def ftpKeepAlive():
# Keep FTP alive
ftp.voidcmd('NOOP') # Send a 'NOOP' command every 30 seconds
def ftpConnect():
try:
ftp = FTP(ftpIP) # This times out after 20 sec
ftp.login(XXXXX)
ftp.cwd(ftpDirectory)
ftp_status = 1
except Exception, e:
print str(e)
ftp_status = 0
pass
# Initialize FTP
ftpIP = '8.8.8.8' # ftp will fail on this IP
ftp_status = 0
ftpConnect()
while (1):
if (second == 30):
ftpKeepAlive()
D'autres ont fourni des réponses à votre question spécifique qui conservent l'utilisation d'une variable globale. Mais vous ne devriez pas avoir besoin d'utiliser global
de cette manière. Au lieu de cela, demandez à ftpConnect()
de renvoyer le client FTP
. Ensuite, vous pouvez transmettre cet objet à d'autres fonctions selon vos besoins. Par exemple:
import time
from ftplib import FTP
def ftpKeepAlive(ftp):
# Keep FTP alive
ftp.voidcmd('NOOP') # Send a 'NOOP' command
def ftpConnect(ftpIP, ftp_directory='.', user='', passwd=''):
try:
ftp = FTP(ftpIP)
ftp.login(user, passwd)
ftp.cwd(ftp_directory)
return ftp
except Exception, e:
print str(e)
# Initialize FTP
ftpIP = '8.8.8.8' # ftp will fail on this IP
ftp = ftpConnect(ftpIP)
if ftp:
while (1):
if (second == 30):
ftpKeepAlive(ftp)
else:
print('Failed to connect to FTP server at {}'.format(ftpIP))
def ftpConnect():
global ftp, ftpIP, ftp_status # add this...
try:
ftp = FTP(ftpIP) # This times out after 20 sec
ftp.login(XXXXX)
ftp.cwd(ftpDirectory)
ftp_status = 1
except Exception, e:
print str(e)
ftp_status = 0
pass
Questions connexes
De nouvelles questions
python
Python est un langage de programmation multi-paradigme, typé dynamiquement et polyvalent. Il est conçu pour être rapide à apprendre, comprendre, utiliser et appliquer une syntaxe propre et uniforme. Veuillez noter que Python 2 est officiellement hors support à partir du 01-01-2020. Néanmoins, pour les questions Python spécifiques à la version, ajoutez la balise [python-2.7] ou [python-3.x]. Lorsque vous utilisez une variante Python (par exemple, Jython, PyPy) ou une bibliothèque (par exemple, Pandas et NumPy), veuillez l'inclure dans les balises.