Динамически импортировать вызываемый файл, учитывая полный путь к модулю? - PullRequest
3 голосов
/ 01 февраля 2010
>>> import_path('os.path.join')
<function join at 0x22d4050>

Какой самый простой способ написать import_path (в Python 2.6 и выше)? Предположим, что компонент last всегда вызывается в модуле / пакете.

Ответы [ 3 ]

4 голосов
/ 01 февраля 2010

Похоже, это то, что вы хотите:

def import_path(name):
    modname, _, attr = name.rpartition('.')
    if not modname:
        # name was just a single module name
        return __import__(attr)
    m = __import__(modname, fromlist=[attr])
    return getattr(m, attr)

Чтобы заставить его работать с Python 2.5 и более ранними версиями, где __import__ не принимает аргументы ключевых слов, вам нужно будет использовать:

m = __import__(modname, {}, globals(), [attr])
0 голосов
/ 01 февраля 2010

Видимо следующие работы:

>>> p = 'os.path.join'
>>> a, b = p.rsplit('.', 1)
>>> getattr(__import__(a, fromlist=True), b)
<function join at 0x7f8799865230>
0 голосов
/ 01 февраля 2010

Попробуйте

def import_path(name):
  (mod,mem) = name.rsplit('.',1)
  m = __import__(mod, fromlist=[mem])
  return getattr(m, mem)

Работает как минимум для

>>> import_path('os.walk')
<function walk at 0x7f23c24f8848>

и сейчас

>>> import_path('os.path.join')
<function join at 0x7f7fc7728a28>
...