[ftputil] How to correctlry close a ftp connection

Richard Holden rholden at movenetworks.com
Mon Dec 15 22:19:09 CET 2008


On 12/15/08 12:28 PM, "Yvan Strahm" <yvan.strahm at gmail.com> wrote:

On Sun, Dec 14, 2008 at 10:48 AM, Stefan Schwarzer <sschwarzer at sschwarzer.net> wrote:
Hello,

On 2008-12-12 14:47, Stefan Schwarzer wrote:
> Regarding the symmetry of the FTPHost construction and calling
> the close method, at first sight this looks well. However, if the
> constructor fails, the close method won't be called, so that may
> be the reason why you exhaust the possible number of connections.

It seems I was a bit hasty here. If the _constructor_ fails, the
connection wouldn't have been established in the first place, so
it's not necessary to close it. "Closing" a connection which
actually isn't there may rather cause an exception _in the
"close" call_.

More important, thus, usually are exceptions which happen after
the construction.

> I think you should use a try ... finally construct:
>
> try:
>     print "CONNECTING TO "+ ftp + ftp_dir+file+"\n"
>     host=ftputil.FTPHost(ftp,user,password)
>     try:

That's why the "try" comes _after_ calling the constructor. If
the connection wasn't opened, it doesn't need to be closed.

It's similar in the Python idiom

fobj = open(...)
try:
    ...
finally:
    fobj.close()

>         host.chdir(ftp_dir+file)
>         names=host.listdir(host.curdir)
>         for name in names:
>             if host.path.isfile(name):
>                 p="pep"
>                 m_pep=re.search(p,name)
>                 if m_pep:
>                     returned=name
>                     host.download_if_newer(name,target,'b')

Besides: Behind the scenes download_if_newer opens a new
connection to the FTP server in order to make a file object. So
not only explicit constructor calls generate connections. (There
shouldn't be connection leaks because of that because unused file
objects are reused, and they are closed when the FTPHost object
is closed.)

>     finally:
>         host.close()
> except:
>     ...

The curious thing is that your problem comes from the code which
is executed _before_ you call the constructor that fails with an
exception. :-)

Best regards,
Stefan

Hello Stefan,

Thanks! the nested try:try:finally:except is doing the trick. I didn't count how many time in my original script the first try was " tried " without success  but I suspect that this was the cause of all these not closed connection, as you pointed out in your first reply.

Thanks a lot for your help
Best regards
yvan



I haven't looked into this yet, but this looks like you could use the with syntax if you've got the right version of python, basically it would do most of the work of the try catch blocks and it looks a little cleaner.

-Richard
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://codespeak.net/pipermail/ftputil/attachments/20081215/3f956609/attachment.htm 


More information about the ftputil mailing list