Как импортировать функции из файла, указанного как переменная в python [duplicate]

На самом деле, это не ошибка дизайна, и это происходит не из-за внутренних компонентов, а из-за производительности. Это происходит просто из-за того, что функции в Python являются первоклассными объектами, а не только частью кода.

Как только вы додумаетесь до этого, тогда это полностью имеет смысл: функция - объект, оцениваемый по его определению; параметры по умолчанию являются «данными-членами», и поэтому их состояние может меняться от одного вызова к другому - точно так же, как и к любому другому объекту.

В любом случае Effbot имеет очень хорошее объяснение причин это поведение в Значения параметров по умолчанию в Python . Я нашел это очень ясным, и я действительно предлагаю прочитать его, чтобы лучше узнать, как работают объекты функций.

123
задан theta 3 January 2012 в 23:29
поделиться

3 ответа

Функция __import__ может быть немного трудно понять.

Если вы измените

i = __import__('matplotlib.text')

на

i = __import__('matplotlib.text', fromlist=[''])

, тогда i будет ссылаться на matplotlib.text.

В Python 2.7 и Python 3.1 или более поздней версии вы можете использовать importlib:

import importlib

i = importlib.import_module("matplotlib.text")

Некоторые примечания

  • Если вы пытаетесь импортировать что-то из подпапки, например ./feature/email.py, код будет выглядеть как importlib.import_module("feature.email")
  • Вы ничего не можете импортировать, если в папке нет файла __init__.py с файлом, который вы пытаетесь импортировать
195
ответ дан Nam G VU 21 August 2018 в 11:34
поделиться
  • 1
    importlib должно быть доступно на pypi для & lt; python 2.7 – Jeffrey Jose 19 August 2012 в 13:12
  • 2
  • 3
    Для тех, кто приезжает сюда из Google. Следует отметить, что если вы пытаетесь импортировать что-то из подпапки (например, ./feature/email.py), код будет выглядеть как importlib.import_module("feature.email") – Seanny123 6 December 2013 в 09:13
  • 4
    Наконец, также помните, что вы ничего не можете импортировать, если в папке нет файла __init__.py с файлом, который вы пытаетесь импортировать. – Seanny123 6 December 2013 в 09:31
  • 5
    @mzjn Это для import moduleName, где moduleName - строка. Как насчет from moduleName import *? – Nam G VU 30 May 2017 в 06:47

Я думаю, что importlib.import_module - это то, что вы ищете. (Доступно только для Python> = 2.7 или 3.x):

importlib.import_module('matplotlib.text')
52
ответ дан gecco 21 August 2018 в 11:34
поделиться

потратил некоторое время, пытаясь импортировать модули из списка, и это тот поток, который мне больше всего понравился, но я не понял использование ___import____ -

, поэтому вот как импортировать модуль из строки и получить то же поведение, что и импорт. И попробуйте / за исключением случая с ошибкой. :)

  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)

и да, для python 2.7> у вас есть другие опции, но для 2.6 & lt ;, это работает.

4
ответ дан keen 21 August 2018 в 11:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: