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()
0
user2836976 8 mars 2016 à 01:02

3 réponses

Meilleure réponse

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()
1
EduardoCMB 7 mars 2016 à 23:00

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))
1
mhawke 7 mars 2016 à 23:12
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
0
Goodies 7 mars 2016 à 22:32