[Pythonmac-SIG] urllib and ftplib hang in bundle but not when run
Russell E. Owen
rowen at cesmail.net
Wed May 5 12:57:17 EDT 2004
(I posted a similar message to comp.lang.python, but I'm hoping the fact
that this fails as a bundled app but not when run from the command line
might offer a clue to Mac mavens).
I am having trouble with some ftp code. On some platforms it works fine
and on others it reliably hangs.
The code uses urllib to retrieve a file in a background thread, which
runs the following code. The diagnostic message before urllib.urlopen is
printed, but the one after urllib.urlopen is not:
self._toFile = file(self.toPath, 'wb')
print "opening URL"
self._fromFile = urllib.urlopen(self.fromURL)
print "URL opened" # when hung this does not print
self._totBytes = int(self._totBytes)
self._state = Running
nextData = self._fromFile.read(8192)
if not nextData:
elif self._state == Aborting:
self._readBytes += len(nextData)
except Exception, e:
self._cleanup(Failed, exception = e)
What is really weird, I can only make it hang when run as part of a
fairly large Tkinter application. The same code runs fine standalone or
as part of a minimal Tkinter test application.
Also, the large Tkinter app runs perfectly on my MacOS X 10.3.3 box.
However, I FTP hangs when I build that same code into a
double-clickable app via bundlebuilder (though in all other respects the
bundle works fine). FTP hangs also when I run the same code on a RedHat
box (python 2.3.3).
The same code also used to run fine, suggesting a change at the server
end or in the network. But I can't see how that could make it my code in
some circumstances and fail in others unless I'm also doing something
Anyway, despite the weird inconsistency as to when it works or fails, I
also tried digging deeper into where it was hanging. I converted the
code to running with ftplib (which hangs in the same way, no surprise
since urllib uses ftplib for ftp) and adding diagnostic print
statements. Using ftpObj.ntransfercmd(cmd) to make the transfer I find
it hangs on "makepasv" if a passive transfer (which is what I'd always
used) and on sock.accept if not a passive transfer.
The large application has one other thread for communicating via one TCP
socket. In all other respects the large app runs fine; the ftp hangs
while everything else keeps cooking along. Closing the TCP connection
(which stop the one extra thread) has no effect on the stalled ftp
Any suggestions would be most appreciated.
More information about the Pythonmac-SIG