I\'m working on a documentation (personal) for nested matplotlib (MPL) library, which differs from MPL own provided, by interested submodule packages. I\'m writing Python script which I hope will automate document generation from future MPL releases.
I selected interested submodules/packages and want to list their main classes from which I\'ll generate list and process it with pydoc
Problem is that I can\'t find a way to instruct Python to load submodule from string. Here is example of what I tried:
import matplotlib.text as text
x = dir(text)
.
i = __import__(\'matplotlib.text\')
y = dir(i)
.
j = __import__(\'matplotlib\')
z = dir(j)
And here is 3 way comparison of above lists through pprint:
I don\'t understand what\'s loaded in y
object - it\'s base matplotlib
plus something else, but it lack information that I wanted and that is main classes from matplotlib.text
package. It\'s top blue coloured part on screenshot (x
list)
Please don\'t suggest Sphinx as different approach.
The __import__
function can be a bit hard to understand.
If you change
i = __import__(\'matplotlib.text\')
to
i = __import__(\'matplotlib.text\', fromlist=[\'\'])
then i
will refer to matplotlib.text
.
In Python 2.7 and Python 3.1 or later, you can use importlib
:
import importlib
i = importlib.import_module(\"matplotlib.text\")
Some notes
If you\'re trying to import something from a sub-folder e.g. ./feature/email.py
, the code will look like importlib.import_module(\"feature.email\")
You can\'t import anything if there is no __init__.py
in the folder with file you are trying to import
I think importlib.import_module is what you are looking for. (Only available for Python >= 2.7 or 3.x):
importlib.import_module(\'matplotlib.text\')
spent some time trying to import modules from a list, and this is the thread that got me most of the way there - but I didnt grasp the use of ___import____ -
so here\'s how to import a module from a string, and get the same behavior as just import. And try/except the error case, too. :)
pipmodules = [\'pycurl\', \'ansible\', \'bad_module_no_beer\']
for module in pipmodules:
try:
# because we want to import using a variable, do it this way
module_obj = __import__(module)
# create a global object containging our module
globals()[module] = module_obj
except ImportError:
sys.stderr.write(\"ERROR: missing python module: \" + module + \"\\n\")
sys.exit(1)
and yes, for python 2.7> you have other options - but for 2.6<, this works.