This should hopefully finally clean up the remaining __del__ related
problems with this module, even if an instance of a derived class is
kept alive longer than the urllib module itself...
diff --git a/Lib/urllib.py b/Lib/urllib.py
index 422cb9e..a818adf 100644
--- a/Lib/urllib.py
+++ b/Lib/urllib.py
@@ -27,7 +27,7 @@
import sys
-__version__ = '1.8'
+__version__ = '1.9'
MAXFTPCACHE = 10 # Trim the ftp cache beyond this size
@@ -81,7 +81,7 @@
ftpcache = {}
class URLopener:
- __tempfiles = []
+ __tempfiles = None
# Constructor
def __init__(self, proxies=None):
@@ -91,6 +91,7 @@
server_version = "Python-urllib/%s" % __version__
self.addheaders = [('User-agent', server_version)]
self.__tempfiles = []
+ self.__unlink = os.unlink # See cleanup()
self.tempcache = None
# Undocumented feature: if you assign {} to tempcache,
# it is used to cache files retrieved with
@@ -110,15 +111,18 @@
self.cleanup()
def cleanup(self):
+ # This code sometimes runs when the rest of this module
+ # has already been deleted, so it can't use any globals
+ # or import anything.
if self.__tempfiles:
- import os
for file in self.__tempfiles:
try:
- os.unlink(file)
- except os.error:
+ self.__unlink(file)
+ except:
pass
- URLopener.__tempfiles = []
- self.tempcache = None
+ del self.__tempfiles[:]
+ if self.tempcache:
+ self.tempcache.clear()
# Add a header to be used by the HTTP interface only
# e.g. u.addheader('Accept', 'sound/basic')
@@ -429,11 +433,9 @@
return None, None
def echo_off(self):
- import os
os.system("stty -echo")
def echo_on(self):
- import os
print
os.system("stty echo")