import sys import os import gc import pickle import importlib import time from test import support import readline from zipfile import ZipFile, ZipInfo, ZIP_STORED import zipimport import linecache import doctest import tracemalloc test_src = """\ def get_name(): return __name__ def get_file(): return __file__ """ NOW = time.time() TESTMOD = "ziptestmodule" TEMP_ZIP = os.path.abspath("junk95142.zip") pyc_ext = ('.pyc' if __debug__ else '.pyo') compression = ZIP_STORED def doTest(expected_ext, files, *modules, **kw): z = ZipFile(TEMP_ZIP, "w") old_path = sys.path.copy() try: for name, (mtime, data) in files.items(): zinfo = ZipInfo(name, time.localtime(mtime)) zinfo.compress_type = compression z.writestr(zinfo, data) z.close() stuff = kw.get("stuff", None) if stuff is not None: with open(TEMP_ZIP, "rb") as f: data = f.read() with open(TEMP_ZIP, "wb") as f: f.write(stuff) f.write(data) sys.path.insert(0, TEMP_ZIP) name = ".".join(modules) mod = __import__(name, globals(), locals(), ["__dummy__"]) call = kw.get('call') if call is not None: call(mod) if expected_ext: file = mod.get_file() finally: z.close() os.remove(TEMP_ZIP) mod = None #sys.path = old_path def runDoctest(callback): files = {TESTMOD + ".py": (NOW, test_src), "xyz.txt": (NOW, ">>> log.append(True)\n")} doTest(".py", files, TESTMOD, call=callback) def doDoctestFile( module): log = [] old_master, doctest.master = doctest.master, None try: doctest.testfile( 'xyz.txt', package=module, module_relative=True, globs=locals() ) finally: doctest.master = old_master def testDoctestFile(): runDoctest(doDoctestFile) def doDoctestSuite(module): log = [] doctest.DocFileTest( 'xyz.txt', package=module, module_relative=True, globs=locals() ).run() def testDoctestSuite(): runDoctest(doDoctestSuite) def func(): modules_before=support.modules_setup() testDoctestSuite() support.modules_cleanup(*modules_before) modules_before=support.modules_setup() testDoctestFile() support.modules_cleanup(*modules_before) #gc.collect() tracemalloc.start() for prepare in range(3): func() snapshot1 = tracemalloc.get_traced_memory()[0] for run in range(1000): func() snapshot2 = tracemalloc.get_traced_memory()[0] print("Diff: %+.1f kB" % ((snapshot2 - snapshot1) / 1024))