Импортировать файл, используя строку как имя

Возможный дубликат:
Импорт динамического модуля в Python

Я собираюсь сделать набор файлов в какой-то момент в ближайшее время, и лучший способ организовать его – это иметь список, этот список будет в самом верху файла, а после этого наступит смешной код для обработки что этот список контролирует и как он работает. Я ищу, чтобы написать указанный список только один раз, и указанный список – это список имен папок и файлов в этом формате:

[(folder/filename, bool, bool, int), (folder/filename, bool, bool, int)] 

Как вы можете видеть, folder/filename одинаковы (вроде). Имя файла – это имя папки с .py в конце, но при импорте XXX вам не нужно импортировать XXX.py, поэтому я не вижу, чтобы это вызывало проблему.

Проблема, с которой я сталкиваюсь, импортируется с использованием этого метода …

 for (testName, auto, hardware, bit) in testList: print(testName) paths = "\\" + testName print paths addpath(paths) sys.modules[testName] = testName # One of a few options I've seen suggested on the net print("Path Added") test = testName + ".Helloworld()" eval(test) 

Поэтому для каждого теста, который у меня есть, напечатайте имя, "\\testName" строку, содержащую путь ( "\\testName" ), в этом примере напечатайте тестовый путь, затем добавьте путь к списку ( sys.path.append(path) ), затем распечатайте, чтобы подтвердить, что это произошло, затем соберите строку, которая будет выполнена eval для основного модуля тестов и, в конечном итоге, будет его оценена.

Как вы можете видеть, в настоящее время мне нужен список импорта вверху. Я не могу просто импортировать testName (содержимое testName – это имя модуля, который я хочу импортировать), поскольку он попытается найти модуль с именем testName , а не модуль, называемый содержимым testName .

Я видел несколько примеров того, где это было сделано, но не может найти того, что работает в моих обстоятельствах. Если кто-то может буквально бросить кусок кода, который сделает это, было бы замечательно.

Я также прошу, чтобы меня не повесили, не нарисовали и не расквартировали для использования eval, он используется в очень контролируемой среде (список, через который он циклически входит в файл .py, поэтому нет «конечного пользователя» беспорядок с ним).

3 Solutions collect form web for “Импортировать файл, используя строку как имя”

Не уверен, правильно ли я все понял, но вы можете импортировать модуль динамически с помощью __import__ :

 mod = __import__(testName) mod.HelloWorld() 

Изменить : я не знал, что использование __import__ было обескуражено документами python для кода пользователя: Документация __import__ (как отметил Бакуриу)

Это также должно работать и будет считаться лучшим стилем:

 mod = importlib.import_module(testName) mod.HelloWorld() 
  1. Никогда, никогда, никогда не связывайтесь с sys.modules напрямую, если вы точно не знаете, что делаете.
  2. Есть много способов сделать то, что вы хотите:
    1. __import__ функция __import__
    2. Использование imp.load_module
    3. Использование importlib.import_module

Я бы не стал напрямую использовать __import__ и importlib.import_module на importlib.import_module (что также предлагается в конце документации __import__ ).

Добавьте путь, по которому модуль находится в sys.path. Импортируйте модуль с помощью функции __import__, которая принимает строчную переменную в качестве имени модуля.

 import sys sys.path.insert(0, mypath) # mypath = path of module to be imported imported_module = __import__("string_module_name") # __import__ accepts string imported_module.myfunction() # All symbols in mymodule are now available normally 
  • Обратить строку без использования reverse () или ?
  • Интерпретация строки Python
  • Преобразование строки в dict?
  • Как связать логическое значение с строкой в ​​Python?
  • TypeError: недостаточно аргументов для строки формата при использовании% s
  • string.upper (<str>) и <str> .upper () не будут выполняться
  • Интерполяция строк python
  • Объяснение для рекурсивной функции reverse_string
  • Python - лучший язык программирования в мире.