blob: 97ace60179aaa9fe05990e66baaffedc0b3922d5 [file] [log] [blame]
Georg Brandl116aa622007-08-15 14:28:22 +00001:mod:`modulefinder` --- Find modules used by a script
2=====================================================
3
4.. sectionauthor:: A.M. Kuchling <amk@amk.ca>
5
6
7.. module:: modulefinder
8 :synopsis: Find modules used by a script.
9
Raymond Hettinger469271d2011-01-27 20:38:46 +000010**Source code:** :source:`Lib/modulefinder.py`
11
12--------------
Georg Brandl116aa622007-08-15 14:28:22 +000013
Georg Brandl116aa622007-08-15 14:28:22 +000014This module provides a :class:`ModuleFinder` class that can be used to determine
15the set of modules imported by a script. ``modulefinder.py`` can also be run as
16a script, giving the filename of a Python script as its argument, after which a
17report of the imported modules will be printed.
18
19
20.. function:: AddPackagePath(pkg_name, path)
21
22 Record that the package named *pkg_name* can be found in the specified *path*.
23
24
25.. function:: ReplacePackage(oldname, newname)
26
27 Allows specifying that the module named *oldname* is in fact the package named
Martin v. Löwis2f48d892011-05-09 08:05:43 +020028 *newname*.
Georg Brandl116aa622007-08-15 14:28:22 +000029
30
Georg Brandlcd7f32b2009-06-08 09:13:45 +000031.. class:: ModuleFinder(path=None, debug=0, excludes=[], replace_paths=[])
Georg Brandl116aa622007-08-15 14:28:22 +000032
33 This class provides :meth:`run_script` and :meth:`report` methods to determine
34 the set of modules imported by a script. *path* can be a list of directories to
35 search for modules; if not specified, ``sys.path`` is used. *debug* sets the
Neal Norwitz752abd02008-05-13 04:55:24 +000036 debugging level; higher values make the class print debugging messages about
Georg Brandl116aa622007-08-15 14:28:22 +000037 what it's doing. *excludes* is a list of module names to exclude from the
38 analysis. *replace_paths* is a list of ``(oldpath, newpath)`` tuples that will
39 be replaced in module paths.
40
41
Benjamin Petersone41251e2008-04-25 01:59:09 +000042 .. method:: report()
Georg Brandl116aa622007-08-15 14:28:22 +000043
Benjamin Petersone41251e2008-04-25 01:59:09 +000044 Print a report to standard output that lists the modules imported by the
45 script and their paths, as well as modules that are missing or seem to be
46 missing.
Georg Brandl116aa622007-08-15 14:28:22 +000047
Benjamin Petersone41251e2008-04-25 01:59:09 +000048 .. method:: run_script(pathname)
Georg Brandl116aa622007-08-15 14:28:22 +000049
Benjamin Petersone41251e2008-04-25 01:59:09 +000050 Analyze the contents of the *pathname* file, which must contain Python
51 code.
Georg Brandl116aa622007-08-15 14:28:22 +000052
Benjamin Petersone41251e2008-04-25 01:59:09 +000053 .. attribute:: modules
Georg Brandl116aa622007-08-15 14:28:22 +000054
Benjamin Petersone41251e2008-04-25 01:59:09 +000055 A dictionary mapping module names to modules. See
56 :ref:`modulefinder-example`
Christian Heimesd3eb5a152008-02-24 00:38:49 +000057
58
59.. _modulefinder-example:
60
61Example usage of :class:`ModuleFinder`
62--------------------------------------
63
64The script that is going to get analyzed later on (bacon.py)::
65
66 import re, itertools
67
68 try:
69 import baconhameggs
70 except ImportError:
71 pass
72
73 try:
74 import guido.python.ham
75 except ImportError:
76 pass
77
78
79The script that will output the report of bacon.py::
80
81 from modulefinder import ModuleFinder
82
83 finder = ModuleFinder()
84 finder.run_script('bacon.py')
85
Neal Norwitz752abd02008-05-13 04:55:24 +000086 print('Loaded modules:')
87 for name, mod in finder.modules.items():
88 print('%s: ' % name, end='')
Ezio Melotti8f7649e2009-09-13 04:48:45 +000089 print(','.join(list(mod.globalnames.keys())[:3]))
Christian Heimesd3eb5a152008-02-24 00:38:49 +000090
Neal Norwitz752abd02008-05-13 04:55:24 +000091 print('-'*50)
92 print('Modules not imported:')
93 print('\n'.join(finder.badmodules.keys()))
Christian Heimesd3eb5a152008-02-24 00:38:49 +000094
95Sample output (may vary depending on the architecture)::
96
97 Loaded modules:
98 _types:
Alexandre Vassalottif7fa63d2008-05-11 08:55:36 +000099 copyreg: _inverted_registry,_slotnames,__all__
Christian Heimesd3eb5a152008-02-24 00:38:49 +0000100 sre_compile: isstring,_sre,_optimize_unicode
101 _sre:
102 sre_constants: REPEAT_ONE,makedict,AT_END_LINE
103 sys:
104 re: __module__,finditer,_expand
105 itertools:
106 __main__: re,itertools,baconhameggs
107 sre_parse: __getslice__,_PATTERNENDERS,SRE_FLAG_UNICODE
108 array:
109 types: __module__,IntType,TypeType
110 ---------------------------------------------------
111 Modules not imported:
112 guido.python.ham
113 baconhameggs
114
115