checkpyc.py revision 9a6757dadeab6077f26f3bdfda17585780468121
1b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis# Check that all ".pyc" files exist and are up-to-date 2b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis# Uses module 'os' 3b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis 4b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwisimport sys 5b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwisimport os 6b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwisfrom stat import ST_MTIME 7b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis 8b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwisdef main(): 9b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis silent = 0 10b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis verbose = 0 11b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis if sys.argv[1:]: 12b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis if sys.argv[1] == '-v': 13b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis verbose = 1 14b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis elif sys.argv[1] == '-s': 15b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis silent = 1 16b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis MAGIC = '\0\0\0\0' 17b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis try: 18b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis if sys.version[:5] >= '0.9.4': 19b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis MAGIC = '\224\224\224\0' 20b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis except: 21b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis pass 22b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis if not silent: 23b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis print 'Using MAGIC word', `MAGIC` 24b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis for dirname in sys.path: 25b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis try: 26b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis names = os.listdir(dirname) 27b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis except os.error: 28b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis print 'Cannot list directory', `dirname` 29b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis continue 30b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis if not silent: 31b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis print 'Checking', `dirname`, '...' 32b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis names.sort() 33b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis for name in names: 34b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis if name[-3:] == '.py': 35b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis name = os.path.join(dirname, name) 36b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis try: 37b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis st = os.stat(name) 38b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis except os.error: 39b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis print 'Cannot stat', `name` 40b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis continue 41b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis if verbose: 42b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis print 'Check', `name`, '...' 43b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis name_c = name + 'c' 44b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis try: 45b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis f = open(name_c, 'r') 46b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis except IOError: 47b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis print 'Cannot open', `name_c` 48b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis continue 49b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis magic_str = f.read(4) 50b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis mtime_str = f.read(4) 51b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis f.close() 52b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis if magic_str <> MAGIC: 53b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis print 'Bad MAGIC word in ".pyc" file', 54b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis print `name_c` 55b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis continue 56b21cb5fa7d4e820d470a4dc5a80544e0e0965c86Martin v. Löwis mtime = get_long(mtime_str) 57 if mtime == 0 or mtime == -1: 58 print 'Bad ".pyc" file', `name_c` 59 elif mtime <> st[ST_MTIME]: 60 print 'Out-of-date ".pyc" file', 61 print `name_c` 62 63def get_long(s): 64 if len(s) <> 4: 65 return -1 66 return ord(s[0]) + (ord(s[1])<<8) + (ord(s[2])<<16) + (ord(s[3])<<24) 67 68main() 69