1 def find_commands(management_dir): 2 """ 3 Given a path to a management directory, returns a list of all the command 4 names that are available. 5 6 Returns an empty list if no commands are defined. 7 """ 8 command_dir = os.path.join(management_dir, 'commands') 9 # l = [] 10 # for _, name, is_pkg in pkgutil.iter_modules([npath(command_dir)]): #生成器走一回,返回对象含多个元素 11 # if not is_pkg and not name.startswith('_'): 12 # l.append(name) 13 # l结果:['check', 'compilemessages', 'createcachetable', 'dbshell', 'diffsettings', 'dumpdata', 'flush', 'inspectdb', 'loaddata', 'makemessages', 14 # 'makemigrations', 'migrate', 'runserver', 'sendtestemail', 'shell', 'showmigrations', 'sqlflush', 'sqlmigrate', 'sqlsequencereset', 'squashmigrations', 15 # 'startapp', 'startproject', 'test', 'testserver'] 16 17 return [name for _, name, is_pkg in pkgutil.iter_modules([npath(command_dir)]) 18 if not is_pkg and not name.startswith('_')]
1 def iter_modules(path=None, prefix=''): 2 """Yields (module_loader, name, ispkg) for all submodules on path, 3 or, if path is None, all top-level modules on sys.path. 4 5 'path' should be either None or a list of paths to look for 6 modules in. 7 8 'prefix' is a string to output on the front of every module name 9 on output. 10 """ 11 12 if path is None: 13 importers = iter_importers() 14 else: 15 importers = map(get_importer, path) 16 17 yielded = {} 18 for i in importers: #生成器走一回,返回对象只有一个元素 19 for name, ispkg in iter_importer_modules(i, prefix): #生成器走一回,返回对象含多个元素,数量与path路径的文件数一致 20 if name not in yielded: 21 yielded[name] = 1 22 yield i, name, ispkg 23 24 25 @simplegeneric 26 def iter_importer_modules(importer, prefix=''): 27 if not hasattr(importer, 'iter_modules'): 28 return [] 29 return importer.iter_modules(prefix)
1 def get_importer(path_item): 2 """Retrieve a PEP 302 importer for the given path item 3 4 The returned importer is cached in sys.path_importer_cache 5 if it was newly created by a path hook. 6 7 The cache (or part of it) can be cleared manually if a 8 rescan of sys.path_hooks is necessary. 9 """ 10 try: 11 importer = sys.path_importer_cache[path_item] 12 except KeyError: 13 for path_hook in sys.path_hooks: 14 try: 15 importer = path_hook(path_item) 16 sys.path_importer_cache.setdefault(path_item, importer) 17 break 18 except ImportError: 19 pass 20 else: 21 importer = None 22 return importer