import marshal import tokenize import os.path import sys PROGRAM_DIR = os.path.dirname(__file__) SRC_DIR = os.path.dirname(PROGRAM_DIR) def writecode(fp, mod, data): print('unsigned char M_%s[] = {' % mod, file=fp) indent = ' ' * 4 for i in range(0, len(data), 16): print(indent, file=fp, end='') for c in bytes(data[i:i+16]): print('%d,' % c, file=fp, end='') print('', file=fp) print('};', file=fp) def dump(fp, filename, name): # Strip the directory to get reproducible marshal dump code_filename = os.path.basename(filename) with tokenize.open(filename) as source_fp: source = source_fp.read() code = compile(source, code_filename, 'exec') data = marshal.dumps(code) writecode(fp, name, data) def main(): if len(sys.argv) < 2: print(f"usage: {sys.argv[0]} filename") sys.exit(1) filename = sys.argv[1] with open(filename, "w") as fp: print("// Auto-generated by Programs/freeze_test_frozenmain.py", file=fp) frozenmain = os.path.join(PROGRAM_DIR, 'test_frozenmain.py') dump(fp, frozenmain, 'test_frozenmain') print(f"{filename} written") if __name__ == "__main__": main()