Search code examples
pythonftpftplibno-op

Checking FTP connection is valid using NOOP command


I'm having trouble with one of my scripts seemingly disconnecting from my FTP during long batches of jobs. To counter this, I've attempted to make a module as shown below:

def connect_ftp(ftp):
    print "ftp1"
    starttime = time.time()
    retry = False
    try:
        ftp.voidcmd("NOOP")
        print "ftp2"
    except:
        retry = True
        print "ftp3"
    print "ftp4"
    while (retry):
        try:
            print "ftp5"
            ftp.connect()
            ftp.login('LOGIN', 'CENSORED')
            print "ftp6"
            retry = False
            print "ftp7"
        except IOError as e:
            print "ftp8"
            retry = True
            sys.stdout.write("\rTime disconnected - "+str(time.time()-starttime))
            sys.stdout.flush()
            print "ftp9"

I call the function using only:

ftp = ftplib.FTP('CENSORED')
connect_ftp(ftp)

However, I've traced how the code runs using print lines, and on the first use of the module (before the FTP is even connected to) my script runs ftp.voidcmd("NOOP") and does not except it, so no attempt is made to connect to the FTP initially.

The output is:

ftp1
ftp2
ftp4
ftp success #this is ran after the module is called

I admit my code isn't the best or prettiest, and I haven't implemented anything yet to make sure I'm not reconnecting constantly if I keep failing to reconnect, but I can't work out why this isn't working for the life of me so I don't see a point in expanding the module yet. Is this even the best approach for connecting/reconnecting to an FTP?

Thank you in advance


Solution

  • This connects to the server:

    ftp = ftplib.FTP('CENSORED')
    

    So, naturally the NOOP command succeeds, as it does not need an authenticated connection.

    Your connect_ftp is correct, except that you need to specify a hostname in your connect call.