Odd/Weird errors with FTPLib

MRAB python at mrabarnett.plus.com
Sun Sep 13 18:47:05 EDT 2009


Bakes wrote:
> On 13 Sep, 22:41, Chris Rebert <c... at rebertia.com> wrote:
>> On Sun, Sep 13, 2009 at 2:34 PM, Bakes <ba... at ymail.com> wrote:
>>> I am using a simple python script to download my logfiles. This is on
>>> a while loop, the logfile grows rapidly, so it is necessary for python
>>> to start downloading the new script as soon as it has finished the
>>> old.
>>> It works fine (for about 20 minutes), then crashes. I have removed a
>>> couple of excepts, and have narrowed the error down to a 'error_perm:
>>> 550 logfile.log: The data is invalid.' error.
>>> Does anyone know what the problem might be regarding this, and what I
>>> might do to fix it?
>> Including an actual code snippet and the full error traceback would help a lot.
>>
>> According tohttp://en.wikipedia.org/wiki/List_of_FTP_server_return_codes,
>> error code 550 translates to:
>> "Requested action not taken. File unavailable (e.g., file not found,
>> no access)."
>>
>> Does the logfile get rotated or something, thus causing it to briefly not exist?
>>
>> It might also help if you explain how your logfile system works.
>>
>> Cheers,
>> Chris
>> --http://blog.rebertia.com
> 
> It's a cod4 gameserver logfile, being downloaded for a python bot to
> parse.
> 
> The logfile is downloaded using this try/except while loop.
> 
> 
>     while True:
>         try:
>             if ftp == False:
>                 self.debug('FTP connection not active, attempting to (re)connect')
>                 ftp = self.ftpconnect()
>             size=os.path.getsize('games_mp.log')
>             ftp.retrbinary('RETR ' + os.path.basename(self.ftpconfig ['path']), handleDownload, rest=size)
>             if self.console._paused:
>                 self.console.unpause()
>         except:
>             print error
>             self.debug('Lost connection to server, pausing until updated properly, Sleeping 10 seconds')
>             self.console.pause()
>             try:
>                 ftp.close()
>                 self.debug('FTP Connection Closed')
>             except:
>                 self.debug('FTP does not appear to be open, so not closed')
>             ftp = False
>             time.sleep(10)
> 
> 
> I can only assume that occasionally, the logfile is being written to
> by the gameserver at the same time that it's downloading.
> If this was the case, do you think a try: download except: sleep
> 900msec then download loop would work?

Bare excepts are almost always a bad idea because they'll catch _all_
exceptions, both those you expect could happen and those you don't.
Catch only those you expect.

For example, if the file 'games_mp.log' doesn't exist then 
os.path.getsize('games_mp.log') will raise an exception, and if you
forgot to import the os module then that will raise a NameError
exception.

Anyway, I can't see how you leave the loop; I'd expect something like a
'break' statement.

And as a matter of style, I'd prefer None to False to indicate when
there's no FTP connection (and "if not ftp" instead of "if ftp ==
False").



More information about the Python-list mailing list