[Python-checkins] bpo-22831: Use "with" to avoid possible fd leaks in tools (part 2). (GH-10927)

Serhiy Storchaka webhook-mailer at python.org
Sat Mar 30 02:33:06 EDT 2019


https://github.com/python/cpython/commit/172bb39452ae8b3ccdf5d1f23ead46f44200cd49
commit: 172bb39452ae8b3ccdf5d1f23ead46f44200cd49
branch: master
author: Serhiy Storchaka <storchaka at gmail.com>
committer: GitHub <noreply at github.com>
date: 2019-03-30T08:33:02+02:00
summary:

bpo-22831: Use "with" to avoid possible fd leaks in tools (part 2). (GH-10927)

files:
M Tools/demo/markov.py
M Tools/demo/rpython.py
M Tools/demo/rpythond.py
M Tools/freeze/checkextensions_win32.py
M Tools/freeze/freeze.py
M Tools/i18n/pygettext.py
M Tools/scripts/cleanfuture.py
M Tools/scripts/combinerefs.py
M Tools/scripts/dutree.py
M Tools/scripts/eptags.py
M Tools/scripts/finddiv.py
M Tools/scripts/fixnotice.py
M Tools/scripts/fixps.py
M Tools/scripts/get-remote-certificate.py
M Tools/scripts/h2py.py
M Tools/scripts/ifdef.py
M Tools/scripts/md5sum.py
M Tools/scripts/mkreal.py
M Tools/scripts/nm2def.py
M Tools/scripts/objgraph.py
M Tools/scripts/parseentities.py
M Tools/scripts/pathfix.py
M Tools/scripts/pdeps.py
M Tools/scripts/ptags.py
M Tools/scripts/rgrep.py
M Tools/unicode/gencjkcodecs.py
M Tools/unicode/gencodec.py

diff --git a/Tools/demo/markov.py b/Tools/demo/markov.py
index 7a0720fa7c34..9729f3820fa0 100755
--- a/Tools/demo/markov.py
+++ b/Tools/demo/markov.py
@@ -78,9 +78,9 @@ def test():
                     continue
             else:
                 f = open(filename, 'r')
-            if debug: print('processing', filename, '...')
-            text = f.read()
-            f.close()
+            with f:
+                if debug: print('processing', filename, '...')
+                text = f.read()
             paralist = text.split('\n\n')
             for para in paralist:
                 if debug > 1: print('feeding ...')
diff --git a/Tools/demo/rpython.py b/Tools/demo/rpython.py
index 5e7bc0a27d11..8d7e2747636c 100755
--- a/Tools/demo/rpython.py
+++ b/Tools/demo/rpython.py
@@ -22,17 +22,16 @@ def main():
         port = int(port[i+1:])
         host = host[:i]
     command = ' '.join(sys.argv[2:])
-    s = socket(AF_INET, SOCK_STREAM)
-    s.connect((host, port))
-    s.send(command.encode())
-    s.shutdown(SHUT_WR)
-    reply = b''
-    while True:
-        data = s.recv(BUFSIZE)
-        if not data:
-            break
-        reply += data
-    print(reply.decode(), end=' ')
-    s.close()
+    with socket(AF_INET, SOCK_STREAM) as s:
+        s.connect((host, port))
+        s.send(command.encode())
+        s.shutdown(SHUT_WR)
+        reply = b''
+        while True:
+            data = s.recv(BUFSIZE)
+            if not data:
+                break
+            reply += data
+        print(reply.decode(), end=' ')
 
 main()
diff --git a/Tools/demo/rpythond.py b/Tools/demo/rpythond.py
index 9ffe13ab4fee..a885b3e946a1 100755
--- a/Tools/demo/rpythond.py
+++ b/Tools/demo/rpythond.py
@@ -26,16 +26,16 @@ def main():
     s.listen(1)
     while True:
         conn, (remotehost, remoteport) = s.accept()
-        print('connection from', remotehost, remoteport)
-        request = b''
-        while 1:
-            data = conn.recv(BUFSIZE)
-            if not data:
-                break
-            request += data
-        reply = execute(request.decode())
-        conn.send(reply.encode())
-        conn.close()
+        with conn:
+            print('connection from', remotehost, remoteport)
+            request = b''
+            while 1:
+                data = conn.recv(BUFSIZE)
+                if not data:
+                    break
+                request += data
+            reply = execute(request.decode())
+            conn.send(reply.encode())
 
 def execute(request):
     stdout = sys.stdout
diff --git a/Tools/freeze/checkextensions_win32.py b/Tools/freeze/checkextensions_win32.py
index c9cb576ae520..64350df2b84f 100644
--- a/Tools/freeze/checkextensions_win32.py
+++ b/Tools/freeze/checkextensions_win32.py
@@ -130,7 +130,8 @@ def parse_dsp(dsp):
     ret = []
     dsp_path, dsp_name = os.path.split(dsp)
     try:
-        lines = open(dsp, "r").readlines()
+        with open(dsp, "r") as fp:
+            lines = fp.readlines()
     except IOError as msg:
         sys.stderr.write("%s: %s\n" % (dsp, msg))
         return None
diff --git a/Tools/freeze/freeze.py b/Tools/freeze/freeze.py
index 3ab56fd0fe1d..83aa508a46a9 100755
--- a/Tools/freeze/freeze.py
+++ b/Tools/freeze/freeze.py
@@ -142,7 +142,8 @@ def main():
         # last option can not be "-i", so this ensures "pos+1" is in range!
         if sys.argv[pos] == '-i':
             try:
-                options = open(sys.argv[pos+1]).read().split()
+                with open(sys.argv[pos+1]) as infp:
+                    options = infp.read().split()
             except IOError as why:
                 usage("File name '%s' specified with the -i option "
                       "can not be read - %s" % (sys.argv[pos+1], why) )
diff --git a/Tools/i18n/pygettext.py b/Tools/i18n/pygettext.py
index b46dd339736f..b1d281d793bd 100755
--- a/Tools/i18n/pygettext.py
+++ b/Tools/i18n/pygettext.py
@@ -561,9 +561,8 @@ class Options:
     # initialize list of strings to exclude
     if options.excludefilename:
         try:
-            fp = open(options.excludefilename)
-            options.toexclude = fp.readlines()
-            fp.close()
+            with open(options.excludefilename) as fp:
+                options.toexclude = fp.readlines()
         except IOError:
             print(_(
                 "Can't read --exclude-file: %s") % options.excludefilename, file=sys.stderr)
diff --git a/Tools/scripts/cleanfuture.py b/Tools/scripts/cleanfuture.py
index b48ab60dd65b..94f691263215 100755
--- a/Tools/scripts/cleanfuture.py
+++ b/Tools/scripts/cleanfuture.py
@@ -96,11 +96,11 @@ def check(file):
         errprint("%r: I/O Error: %s" % (file, str(msg)))
         return
 
-    ff = FutureFinder(f, file)
-    changed = ff.run()
-    if changed:
-        ff.gettherest()
-    f.close()
+    with f:
+        ff = FutureFinder(f, file)
+        changed = ff.run()
+        if changed:
+            ff.gettherest()
     if changed:
         if verbose:
             print("changed.")
@@ -122,9 +122,8 @@ def check(file):
             os.rename(file, bak)
             if verbose:
                 print("renamed", file, "to", bak)
-            g = open(file, "w")
-            ff.write(g)
-            g.close()
+            with open(file, "w") as g:
+                ff.write(g)
             if verbose:
                 print("wrote new", file)
     else:
diff --git a/Tools/scripts/combinerefs.py b/Tools/scripts/combinerefs.py
index 7ca95267c93d..49ccca73909f 100755
--- a/Tools/scripts/combinerefs.py
+++ b/Tools/scripts/combinerefs.py
@@ -85,9 +85,7 @@ def read(fileiter, pat, whilematch):
         else:
             break
 
-def combine(fname):
-    f = open(fname)
-
+def combinefile(f):
     fi = iter(f)
 
     for line in read(fi, re.compile(r'^Remaining objects:$'), False):
@@ -121,8 +119,11 @@ def combine(fname):
             print('[%s->%s]' % (addr2rc[addr], rc), end=' ')
         print(guts, addr2guts[addr])
 
-    f.close()
     print("%d objects before, %d after" % (before, after))
 
+def combine(fname):
+    with open(fname) as f:
+        combinefile(f)
+
 if __name__ == '__main__':
     combine(sys.argv[1])
diff --git a/Tools/scripts/dutree.py b/Tools/scripts/dutree.py
index 6b4361ac6138..d25cf72b707e 100755
--- a/Tools/scripts/dutree.py
+++ b/Tools/scripts/dutree.py
@@ -4,18 +4,18 @@
 import os, sys, errno
 
 def main():
-    p = os.popen('du ' + ' '.join(sys.argv[1:]), 'r')
     total, d = None, {}
-    for line in p.readlines():
-        i = 0
-        while line[i] in '0123456789': i = i+1
-        size = eval(line[:i])
-        while line[i] in ' \t': i = i+1
-        filename = line[i:-1]
-        comps = filename.split('/')
-        if comps[0] == '': comps[0] = '/'
-        if comps[len(comps)-1] == '': del comps[len(comps)-1]
-        total, d = store(size, comps, total, d)
+    with os.popen('du ' + ' '.join(sys.argv[1:])) as p:
+        for line in p:
+            i = 0
+            while line[i] in '0123456789': i = i+1
+            size = eval(line[:i])
+            while line[i] in ' \t': i = i+1
+            filename = line[i:-1]
+            comps = filename.split('/')
+            if comps[0] == '': comps[0] = '/'
+            if comps[len(comps)-1] == '': del comps[len(comps)-1]
+            total, d = store(size, comps, total, d)
     try:
         display(total, d)
     except IOError as e:
diff --git a/Tools/scripts/eptags.py b/Tools/scripts/eptags.py
index 401ac7e29cd2..7f8059ba71ad 100755
--- a/Tools/scripts/eptags.py
+++ b/Tools/scripts/eptags.py
@@ -28,29 +28,30 @@ def treat_file(filename, outfp):
     except OSError:
         sys.stderr.write('Cannot open %s\n'%filename)
         return
-    charno = 0
-    lineno = 0
-    tags = []
-    size = 0
-    while 1:
-        line = fp.readline()
-        if not line:
-            break
-        lineno = lineno + 1
-        m = matcher.search(line)
-        if m:
-            tag = m.group(0) + '\177%d,%d\n' % (lineno, charno)
-            tags.append(tag)
-            size = size + len(tag)
-        charno = charno + len(line)
+    with fp:
+        charno = 0
+        lineno = 0
+        tags = []
+        size = 0
+        while 1:
+            line = fp.readline()
+            if not line:
+                break
+            lineno = lineno + 1
+            m = matcher.search(line)
+            if m:
+                tag = m.group(0) + '\177%d,%d\n' % (lineno, charno)
+                tags.append(tag)
+                size = size + len(tag)
+            charno = charno + len(line)
     outfp.write('\f\n%s,%d\n' % (filename,size))
     for tag in tags:
         outfp.write(tag)
 
 def main():
-    outfp = open('TAGS', 'w')
-    for filename in sys.argv[1:]:
-        treat_file(filename, outfp)
+    with open('TAGS', 'w') as outfp:
+        for filename in sys.argv[1:]:
+            treat_file(filename, outfp)
 
 if __name__=="__main__":
     main()
diff --git a/Tools/scripts/finddiv.py b/Tools/scripts/finddiv.py
index a705f562036e..d21253cf1c8a 100755
--- a/Tools/scripts/finddiv.py
+++ b/Tools/scripts/finddiv.py
@@ -55,17 +55,17 @@ def process(filename, listnames):
     except IOError as msg:
         sys.stderr.write("Can't open: %s\n" % msg)
         return 1
-    g = tokenize.generate_tokens(fp.readline)
-    lastrow = None
-    for type, token, (row, col), end, line in g:
-        if token in ("/", "/="):
-            if listnames:
-                print(filename)
-                break
-            if row != lastrow:
-                lastrow = row
-                print("%s:%d:%s" % (filename, row, line), end=' ')
-    fp.close()
+    with fp:
+        g = tokenize.generate_tokens(fp.readline)
+        lastrow = None
+        for type, token, (row, col), end, line in g:
+            if token in ("/", "/="):
+                if listnames:
+                    print(filename)
+                    break
+                if row != lastrow:
+                    lastrow = row
+                    print("%s:%d:%s" % (filename, row, line), end=' ')
 
 def processdir(dir, listnames):
     try:
diff --git a/Tools/scripts/fixnotice.py b/Tools/scripts/fixnotice.py
index ad967f94781c..317051dd82f3 100755
--- a/Tools/scripts/fixnotice.py
+++ b/Tools/scripts/fixnotice.py
@@ -73,22 +73,19 @@ def main():
         elif opt == '--dry-run':
             DRYRUN = 1
         elif opt == '--oldnotice':
-            fp = open(arg)
-            OLD_NOTICE = fp.read()
-            fp.close()
+            with open(arg) as fp:
+                OLD_NOTICE = fp.read()
         elif opt == '--newnotice':
-            fp = open(arg)
-            NEW_NOTICE = fp.read()
-            fp.close()
+            with open(arg) as fp:
+                NEW_NOTICE = fp.read()
 
     for arg in args:
         process(arg)
 
 
 def process(file):
-    f = open(file)
-    data = f.read()
-    f.close()
+    with open(file) as f:
+        data = f.read()
     i = data.find(OLD_NOTICE)
     if i < 0:
         if VERBOSE:
@@ -102,9 +99,8 @@ def process(file):
     data = data[:i] + NEW_NOTICE + data[i+len(OLD_NOTICE):]
     new = file + ".new"
     backup = file + ".bak"
-    f = open(new, "w")
-    f.write(data)
-    f.close()
+    with open(new, "w") as f:
+        f.write(data)
     os.rename(file, backup)
     os.rename(new, file)
 
diff --git a/Tools/scripts/fixps.py b/Tools/scripts/fixps.py
index b00226120684..725300e56a27 100755
--- a/Tools/scripts/fixps.py
+++ b/Tools/scripts/fixps.py
@@ -14,20 +14,18 @@ def main():
         except IOError as msg:
             print(filename, ': can\'t open :', msg)
             continue
-        line = f.readline()
-        if not re.match('^#! */usr/local/bin/python', line):
-            print(filename, ': not a /usr/local/bin/python script')
-            f.close()
-            continue
-        rest = f.read()
-        f.close()
+        with f:
+            line = f.readline()
+            if not re.match('^#! */usr/local/bin/python', line):
+                print(filename, ': not a /usr/local/bin/python script')
+                continue
+            rest = f.read()
         line = re.sub('/usr/local/bin/python',
                       '/usr/bin/env python', line)
         print(filename, ':', repr(line))
-        f = open(filename, "w")
-        f.write(line)
-        f.write(rest)
-        f.close()
+        with open(filename, "w") as f:
+            f.write(line)
+            f.write(rest)
 
 if __name__ == '__main__':
     main()
diff --git a/Tools/scripts/get-remote-certificate.py b/Tools/scripts/get-remote-certificate.py
index 5811f202eda9..38901286e19a 100755
--- a/Tools/scripts/get-remote-certificate.py
+++ b/Tools/scripts/get-remote-certificate.py
@@ -29,9 +29,8 @@ def strip_to_x509_cert(certfile_contents, outfile=None):
             return None
         else:
             tn = tempfile.mktemp()
-            fp = open(tn, "wb")
-            fp.write(m.group(1) + b"\n")
-            fp.close()
+            with open(tn, "wb") as fp:
+                fp.write(m.group(1) + b"\n")
             try:
                 tn2 = (outfile or tempfile.mktemp())
                 status, output = subproc(r'openssl x509 -in "%s" -out "%s"' %
@@ -39,9 +38,8 @@ def strip_to_x509_cert(certfile_contents, outfile=None):
                 if status != 0:
                     raise RuntimeError('OpenSSL x509 failed with status %s and '
                                        'output: %r' % (status, output))
-                fp = open(tn2, 'rb')
-                data = fp.read()
-                fp.close()
+                with open(tn2, 'rb') as fp:
+                    data = fp.read()
                 os.unlink(tn2)
                 return data
             finally:
@@ -49,9 +47,8 @@ def strip_to_x509_cert(certfile_contents, outfile=None):
 
     if sys.platform.startswith("win"):
         tfile = tempfile.mktemp()
-        fp = open(tfile, "w")
-        fp.write("quit\n")
-        fp.close()
+        with open(tfile, "w") as fp:
+            fp.write("quit\n")
         try:
             status, output = subproc(
                 'openssl s_client -connect "%s:%s" -showcerts < "%s"' %
diff --git a/Tools/scripts/h2py.py b/Tools/scripts/h2py.py
index 4363c0cf7354..ea37c04d4c56 100755
--- a/Tools/scripts/h2py.py
+++ b/Tools/scripts/h2py.py
@@ -69,23 +69,21 @@ def main():
             sys.stdout.write('# Generated by h2py from stdin\n')
             process(sys.stdin, sys.stdout)
         else:
-            fp = open(filename, 'r')
-            outfile = os.path.basename(filename)
-            i = outfile.rfind('.')
-            if i > 0: outfile = outfile[:i]
-            modname = outfile.upper()
-            outfile = modname + '.py'
-            outfp = open(outfile, 'w')
-            outfp.write('# Generated by h2py from %s\n' % filename)
-            filedict = {}
-            for dir in searchdirs:
-                if filename[:len(dir)] == dir:
-                    filedict[filename[len(dir)+1:]] = None  # no '/' trailing
-                    importable[filename[len(dir)+1:]] = modname
-                    break
-            process(fp, outfp)
-            outfp.close()
-            fp.close()
+            with open(filename) as fp:
+                outfile = os.path.basename(filename)
+                i = outfile.rfind('.')
+                if i > 0: outfile = outfile[:i]
+                modname = outfile.upper()
+                outfile = modname + '.py'
+                with open(outfile, 'w') as outfp:
+                    outfp.write('# Generated by h2py from %s\n' % filename)
+                    filedict = {}
+                    for dir in searchdirs:
+                        if filename[:len(dir)] == dir:
+                            filedict[filename[len(dir)+1:]] = None  # no '/' trailing
+                            importable[filename[len(dir)+1:]] = modname
+                            break
+                    process(fp, outfp)
 
 def pytify(body):
     # replace ignored patterns by spaces
@@ -161,9 +159,10 @@ def process(fp, outfp, env = {}):
                     except IOError:
                         pass
                 if inclfp:
-                    outfp.write(
-                            '\n# Included from %s\n' % filename)
-                    process(inclfp, outfp, env)
+                    with inclfp:
+                        outfp.write(
+                                '\n# Included from %s\n' % filename)
+                        process(inclfp, outfp, env)
                 else:
                     sys.stderr.write('Warning - could not find file %s\n' %
                                      filename)
diff --git a/Tools/scripts/ifdef.py b/Tools/scripts/ifdef.py
index b1711ce5c16e..22249b2d0af5 100755
--- a/Tools/scripts/ifdef.py
+++ b/Tools/scripts/ifdef.py
@@ -45,9 +45,8 @@ def main():
         if filename == '-':
             process(sys.stdin, sys.stdout)
         else:
-            f = open(filename, 'r')
-            process(f, sys.stdout)
-            f.close()
+            with open(filename) as f:
+                process(f, sys.stdout)
 
 def process(fpi, fpo):
     keywords = ('if', 'ifdef', 'ifndef', 'else', 'endif')
diff --git a/Tools/scripts/md5sum.py b/Tools/scripts/md5sum.py
index 9cf4bdc9c691..f910576377aa 100755
--- a/Tools/scripts/md5sum.py
+++ b/Tools/scripts/md5sum.py
@@ -47,10 +47,10 @@ def printsum(filename, out=sys.stdout):
     except IOError as msg:
         sys.stderr.write('%s: Can\'t open: %s\n' % (filename, msg))
         return 1
-    if fnfilter:
-        filename = fnfilter(filename)
-    sts = printsumfp(fp, filename, out)
-    fp.close()
+    with fp:
+        if fnfilter:
+            filename = fnfilter(filename)
+        sts = printsumfp(fp, filename, out)
     return sts
 
 def printsumfp(fp, filename, out=sys.stdout):
diff --git a/Tools/scripts/mkreal.py b/Tools/scripts/mkreal.py
index b21909e691d6..f169da43fe11 100755
--- a/Tools/scripts/mkreal.py
+++ b/Tools/scripts/mkreal.py
@@ -18,14 +18,13 @@ def mkrealfile(name):
     st = os.stat(name) # Get the mode
     mode = S_IMODE(st[ST_MODE])
     linkto = os.readlink(name) # Make sure again it's a symlink
-    f_in = open(name, 'r') # This ensures it's a file
-    os.unlink(name)
-    f_out = open(name, 'w')
-    while 1:
-        buf = f_in.read(BUFSIZE)
-        if not buf: break
-        f_out.write(buf)
-    del f_out # Flush data to disk before changing mode
+    with open(name, 'rb') as f_in: # This ensures it's a file
+        os.unlink(name)
+        with open(name, 'wb') as f_out:
+            while 1:
+                buf = f_in.read(BUFSIZE)
+                if not buf: break
+                f_out.write(buf)
     os.chmod(name, mode)
 
 def mkrealdir(name):
diff --git a/Tools/scripts/nm2def.py b/Tools/scripts/nm2def.py
index 83bbcd749f4d..a885ebd6fecc 100755
--- a/Tools/scripts/nm2def.py
+++ b/Tools/scripts/nm2def.py
@@ -42,7 +42,8 @@
 
 def symbols(lib=PYTHONLIB,types=('T','C','D')):
 
-    lines = os.popen(NM % lib).readlines()
+    with os.popen(NM % lib) as pipe:
+        lines = pipe.readlines()
     lines = [s.strip() for s in lines]
     symbols = {}
     for line in lines:
@@ -97,7 +98,7 @@ def main():
     exports = export_list(s)
     f = sys.stdout # open('PC/python_nt.def','w')
     f.write(DEF_TEMPLATE % (exports))
-    f.close()
+    # f.close()
 
 if __name__ == '__main__':
     main()
diff --git a/Tools/scripts/objgraph.py b/Tools/scripts/objgraph.py
index 3bb1712a9dcf..add41e692c03 100755
--- a/Tools/scripts/objgraph.py
+++ b/Tools/scripts/objgraph.py
@@ -180,7 +180,8 @@ def main():
         if filename == '-':
             readinput(sys.stdin)
         else:
-            readinput(open(filename, 'r'))
+            with open(filename) as f:
+                readinput(f)
     #
     warndups()
     #
diff --git a/Tools/scripts/parseentities.py b/Tools/scripts/parseentities.py
index c686b0241a71..0229d3af86ba 100755
--- a/Tools/scripts/parseentities.py
+++ b/Tools/scripts/parseentities.py
@@ -50,13 +50,15 @@ def writefile(f,defs):
 
 if __name__ == '__main__':
     if len(sys.argv) > 1:
-        infile = open(sys.argv[1])
+        with open(sys.argv[1]) as infile:
+            text = infile.read()
     else:
-        infile = sys.stdin
+        text = sys.stdin.read()
+
+    defs = parse(text)
+
     if len(sys.argv) > 2:
-        outfile = open(sys.argv[2],'w')
+        with open(sys.argv[2],'w') as outfile:
+            writefile(outfile, defs)
     else:
-        outfile = sys.stdout
-    text = infile.read()
-    defs = parse(text)
-    writefile(outfile,defs)
+        writefile(sys.stdout, defs)
diff --git a/Tools/scripts/pathfix.py b/Tools/scripts/pathfix.py
index c5bf984306a3..1a0cf1c9e69c 100755
--- a/Tools/scripts/pathfix.py
+++ b/Tools/scripts/pathfix.py
@@ -103,29 +103,27 @@ def fix(filename):
     except IOError as msg:
         err('%s: cannot open: %r\n' % (filename, msg))
         return 1
-    line = f.readline()
-    fixed = fixline(line)
-    if line == fixed:
-        rep(filename+': no change\n')
-        f.close()
-        return
-    head, tail = os.path.split(filename)
-    tempname = os.path.join(head, '@' + tail)
-    try:
-        g = open(tempname, 'wb')
-    except IOError as msg:
-        f.close()
-        err('%s: cannot create: %r\n' % (tempname, msg))
-        return 1
-    rep(filename + ': updating\n')
-    g.write(fixed)
-    BUFSIZE = 8*1024
-    while 1:
-        buf = f.read(BUFSIZE)
-        if not buf: break
-        g.write(buf)
-    g.close()
-    f.close()
+    with f:
+        line = f.readline()
+        fixed = fixline(line)
+        if line == fixed:
+            rep(filename+': no change\n')
+            return
+        head, tail = os.path.split(filename)
+        tempname = os.path.join(head, '@' + tail)
+        try:
+            g = open(tempname, 'wb')
+        except IOError as msg:
+            err('%s: cannot create: %r\n' % (tempname, msg))
+            return 1
+        with g:
+            rep(filename + ': updating\n')
+            g.write(fixed)
+            BUFSIZE = 8*1024
+            while 1:
+                buf = f.read(BUFSIZE)
+                if not buf: break
+                g.write(buf)
 
     # Finishing touch -- move files
 
diff --git a/Tools/scripts/pdeps.py b/Tools/scripts/pdeps.py
index f8218ac5243d..4e8e930948f1 100755
--- a/Tools/scripts/pdeps.py
+++ b/Tools/scripts/pdeps.py
@@ -64,29 +64,28 @@ def main():
 # Collect data from one file
 #
 def process(filename, table):
-    fp = open(filename, 'r')
-    mod = os.path.basename(filename)
-    if mod[-3:] == '.py':
-        mod = mod[:-3]
-    table[mod] = list = []
-    while 1:
-        line = fp.readline()
-        if not line: break
-        while line[-1:] == '\\':
-            nextline = fp.readline()
-            if not nextline: break
-            line = line[:-1] + nextline
-        m_found = m_import.match(line) or m_from.match(line)
-        if m_found:
-            (a, b), (a1, b1) = m_found.regs[:2]
-        else: continue
-        words = line[a1:b1].split(',')
-        # print '#', line, words
-        for word in words:
-            word = word.strip()
-            if word not in list:
-                list.append(word)
-    fp.close()
+    with open(filename) as fp:
+        mod = os.path.basename(filename)
+        if mod[-3:] == '.py':
+            mod = mod[:-3]
+        table[mod] = list = []
+        while 1:
+            line = fp.readline()
+            if not line: break
+            while line[-1:] == '\\':
+                nextline = fp.readline()
+                if not nextline: break
+                line = line[:-1] + nextline
+            m_found = m_import.match(line) or m_from.match(line)
+            if m_found:
+                (a, b), (a1, b1) = m_found.regs[:2]
+            else: continue
+            words = line[a1:b1].split(',')
+            # print '#', line, words
+            for word in words:
+                word = word.strip()
+                if word not in list:
+                    list.append(word)
 
 
 # Compute closure (this is in fact totally general)
diff --git a/Tools/scripts/ptags.py b/Tools/scripts/ptags.py
index 396cbd07ea4d..eedd411702c1 100755
--- a/Tools/scripts/ptags.py
+++ b/Tools/scripts/ptags.py
@@ -19,9 +19,9 @@ def main():
     for filename in args:
         treat_file(filename)
     if tags:
-        fp = open('tags', 'w')
-        tags.sort()
-        for s in tags: fp.write(s)
+        with open('tags', 'w') as fp:
+            tags.sort()
+            for s in tags: fp.write(s)
 
 
 expr = r'^[ \t]*(def|class)[ \t]+([a-zA-Z0-9_]+)[ \t]*[:\(]'
@@ -33,21 +33,22 @@ def treat_file(filename):
     except:
         sys.stderr.write('Cannot open %s\n' % filename)
         return
-    base = os.path.basename(filename)
-    if base[-3:] == '.py':
-        base = base[:-3]
-    s = base + '\t' + filename + '\t' + '1\n'
-    tags.append(s)
-    while 1:
-        line = fp.readline()
-        if not line:
-            break
-        m = matcher.match(line)
-        if m:
-            content = m.group(0)
-            name = m.group(2)
-            s = name + '\t' + filename + '\t/^' + content + '/\n'
-            tags.append(s)
+    with fp:
+        base = os.path.basename(filename)
+        if base[-3:] == '.py':
+            base = base[:-3]
+        s = base + '\t' + filename + '\t' + '1\n'
+        tags.append(s)
+        while 1:
+            line = fp.readline()
+            if not line:
+                break
+            m = matcher.match(line)
+            if m:
+                content = m.group(0)
+                name = m.group(2)
+                s = name + '\t' + filename + '\t/^' + content + '/\n'
+                tags.append(s)
 
 if __name__ == '__main__':
     main()
diff --git a/Tools/scripts/rgrep.py b/Tools/scripts/rgrep.py
index 1917e05e4941..c39bf93aad3b 100755
--- a/Tools/scripts/rgrep.py
+++ b/Tools/scripts/rgrep.py
@@ -30,29 +30,30 @@ def main():
         f = open(filename)
     except IOError as msg:
         usage("can't open %r: %s" % (filename, msg), 1)
-    f.seek(0, 2)
-    pos = f.tell()
-    leftover = None
-    while pos > 0:
-        size = min(pos, bufsize)
-        pos = pos - size
-        f.seek(pos)
-        buffer = f.read(size)
-        lines = buffer.split("\n")
-        del buffer
-        if leftover is None:
-            if not lines[-1]:
-                del lines[-1]
-        else:
-            lines[-1] = lines[-1] + leftover
-        if pos > 0:
-            leftover = lines[0]
-            del lines[0]
-        else:
-            leftover = None
-        for line in reversed(lines):
-            if prog.search(line):
-                print(line)
+    with f:
+        f.seek(0, 2)
+        pos = f.tell()
+        leftover = None
+        while pos > 0:
+            size = min(pos, bufsize)
+            pos = pos - size
+            f.seek(pos)
+            buffer = f.read(size)
+            lines = buffer.split("\n")
+            del buffer
+            if leftover is None:
+                if not lines[-1]:
+                    del lines[-1]
+            else:
+                lines[-1] = lines[-1] + leftover
+            if pos > 0:
+                leftover = lines[0]
+                del lines[0]
+            else:
+                leftover = None
+            for line in reversed(lines):
+                if prog.search(line):
+                    print(line)
 
 
 def usage(msg, code=2):
diff --git a/Tools/unicode/gencjkcodecs.py b/Tools/unicode/gencjkcodecs.py
index ebccfc7f96ba..45866bf2f610 100644
--- a/Tools/unicode/gencjkcodecs.py
+++ b/Tools/unicode/gencjkcodecs.py
@@ -61,7 +61,8 @@ def gencodecs(prefix):
                                        encoding=enc.lower(),
                                        owner=loc)
             codecpath = os.path.join(prefix, enc + '.py')
-            open(codecpath, 'w').write(code)
+            with open(codecpath, 'w') as f:
+                f.write(code)
 
 if __name__ == '__main__':
     import sys
diff --git a/Tools/unicode/gencodec.py b/Tools/unicode/gencodec.py
index 31f0112150d6..1e5aced63aa0 100644
--- a/Tools/unicode/gencodec.py
+++ b/Tools/unicode/gencodec.py
@@ -72,9 +72,8 @@ def parsecodes(codes, len=len, range=range):
 
 def readmap(filename):
 
-    f = open(filename,'r')
-    lines = f.readlines()
-    f.close()
+    with open(filename) as f:
+        lines = f.readlines()
     enc2uni = {}
     identity = []
     unmapped = list(range(256))
@@ -359,18 +358,16 @@ def getregentry():
 def pymap(name,map,pyfile,encodingname,comments=1):
 
     code = codegen(name,map,encodingname,comments)
-    f = open(pyfile,'w')
-    f.write(code)
-    f.close()
+    with open(pyfile,'w') as f:
+        f.write(code)
 
 def marshalmap(name,map,marshalfile):
 
     d = {}
     for e,(u,c) in map.items():
         d[e] = (u,c)
-    f = open(marshalfile,'wb')
-    marshal.dump(d,f)
-    f.close()
+    with open(marshalfile,'wb') as f:
+        marshal.dump(d,f)
 
 def convertdir(dir, dirprefix='', nameprefix='', comments=1):
 
@@ -411,8 +408,8 @@ def rewritepythondir(dir, dirprefix='', comments=1):
         print('converting %s to %s' % (mapname,
                                        dirprefix + codefile))
         try:
-            map = marshal.load(open(os.path.join(dir,mapname),
-                               'rb'))
+            with open(os.path.join(dir, mapname), 'rb') as f:
+                map = marshal.load(f)
             if not map:
                 print('* map is empty; skipping')
             else:



More information about the Python-checkins mailing list