Python: Import all objects from library by variable

Viewed 313

I would like to import all objects from a library by variable. I know how to import all objects from a library:

from package import *

I know how to import a library by variable:

import importlib

var = 'package'
package = importlib.import_module(var)

However, I cannot figure out how to combine these two goals. It does not look like importlib.import supports this. Can anyone help?

Note: I am aware of the dangers of skirting namespaces in this way (and anyone using potential answers to my inquiry should familiarize themselves with the dangers). I only plan to use this for rapid development and testing of some algorithms, and plan to release my code with explicit names of individual objects from my files.

Edit: I came up with a minimal example. Suppose I have three files in the same directory:

aux1.py

var = 'aux2'

aux2.py

a = 0
b = 1

main.py

import importlib

from aux1 import var
aux2 = importlib.import_module(var)

If I run main.py, I can access a and b as aux2.a and aux2.b, but I'd like them to be globals instead. What would the last line of main.py need to be in order to do this?

2 Answers

You could iterate through the __dict__ attribute of the module returned from import_module, and add that item to globals() if it doesn't start with __.

import importlib

var = 'package'
package = importlib.import_module(var)

for name, value in package.__dict__.items():
    if not name.startswith("__"):
        globals()[name] = value

If you only want to import certain members of package, you could use getattr() with a default of None:

imports = ['obj1', 'obj2', 'obj3']
for name in imports:
    value = getattr(package, name, None)
    if value is not None:
        globals()[name] = value
import_module(name, package=None):
    """Import a module.
    The 'package' argument is required when performing a relative import. It
    specifies the package to use as the anchor point from which to resolve the
    relative import to an absolute import.
    """

This is the initialization of the import_module(...) method. Add a comma after name and put the location of the anchor point (a starting folder to reference the file from; for example "C:\Program Files\Java"). The second parameter basically acts like your from, only using absolute paths.

Related