import module from string variable

2018-12-31 21:41发布

问题:

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:

\"enter

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.

回答1:

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



回答2:

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\')


回答3:

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.