File: visitor_poundbang.py
##########################################################
# 5/2001: change all "#!...python" lines at the top of
# scripts to either commandline arg or changeToDefault,
# in all files in all dirs at and below the dir where run;
# could skip binary filename extensions too, but works ok;
# this version changes all #! first lines that name python,
# and so is more accurate than a visitor_replace.py run;
##########################################################
"""
Run me like this, to convert all scripts in the book
examples tree, and redirect/save messages to a file:
C:\...\PP2E>python PyTools\visitor_poundbang.py
#!\MyPython21\python > out.txt
"""
import sys, string
from PP2E.PyTools.visitor import FileVisitor # reuse the walker classes
changeToDefault = '#!\Python21\python' # used if no cmdline arg
class PoundBangFixer(FileVisitor):
def __init__(self, changeTo=changeToDefault):
FileVisitor.__init__(self)
self.changeTo = changeTo
self.clist = []
def visitfile(self, fullname):
FileVisitor.visitfile(self, fullname)
try:
lines = open(fullname, 'r').readlines()
if (len(lines) > 0 and
lines[0][0:2] == '#!' and
string.find(lines[0], 'python') != -1
):
lines[0] = self.changeTo + '\n'
open(fullname, 'w').writelines(lines)
self.clist.append(fullname)
except:
print 'Error translating %s -- skipped' % fullname
print '...', sys.exc_info()
if __name__ == '__main__':
if raw_input('Are you sure?') != 'y': sys.exit()
if len(sys.argv) == 2: changeToDefault = sys.argv[1]
walker = PoundBangFixer(changeToDefault)
walker.run()
print 'Visited %d files and %d dirs,' % (walker.fcount, walker.dcount),
print 'changed %d files' % len(walker.clist)
for fname in walker.clist: print fname