Как динамически загрузить класс Python

Если вы не хотите создавать python-shell собственные, в модуле pydoc есть py функция, которая делает именно python-shell это:

from pydoc import locate
my_class = locate('my_package.my_module.MyClass')

Преимущество этого подхода python-interpreter перед другими, перечисленными python-shell здесь, заключается в том, что reflect locate найдет любой объект python по pythonic указанному пунктирному пути, а reflect не только объект непосредственно python-shell в модуле. например my_package.my_module.MyClass.attr.

Если python-interpreter вам интересно, каков их рецепт, вот python-shell функция:

def locate(path, forceload=0):
    """Locate an object by name or dotted path, importing as necessary."""
    parts = [part for part in split(path, '.') if part]
    module, n = None, 0
    while n < len(parts):
        nextmodule = safeimport(join(parts[:n+1], '.'), forceload)
        if nextmodule: module, n = nextmodule, n + 1
        else: break
    if module:
        object = module
    else:
        object = __builtin__
    for part in parts[n:]:
        try:
            object = getattr(object, part)
        except AttributeError:
            return None
    return object

Он использует функцию python-interpreter pydoc.safeimport. Вот документы для этого:

"""Import a module; handle errors; return None if the module isn't found.

If the module *is* found but an exception occurs, it's wrapped in an
ErrorDuringImport exception and reraised.  Unlike __import__, if a
package path is specified, the module at the end of the path is returned,
not the package at the beginning.  If the optional 'forceload' argument
is 1, we reload the module from disk (unless it's a dynamic extension)."""

python

reflection

python-import

2022-11-19T06:24:07+00:00