Как сделать множественный импорт в Python?

В Ruby, вместо многократного повторения слова «require» («импорт» в Python), я делаю

%w{lib1 lib2 lib3 lib4 lib5}.each { |x| require x }

Таким образом, он перебирает набор «библиотек» и «требует» (импортирует) каждую из них. Сейчас я пишу скрипт на Python и хотел бы сделать что-то подобное. Есть ли способ, или мне нужно написать «импорт» для всех из них.

Прямой «перевод» будет выглядеть примерно так: следующий код. В любом случае, поскольку Python не импортирует библиотеки, названные в виде строк, это не работает.

requirements = [lib1, lib2, lib3, lib4, lib5]
for lib in requirements:
    import lib

заранее спасибо


person Eduardo    schedule 15.07.2010    source источник
comment
На самом деле в Python есть встроенная функция __import__, которую вы можете использовать для импорта модуль, названный в строке. Но он предназначен для вызова из реализации оператора import, а не из пользовательского кода. Конечно, в данном случае это было бы неправильным решением.   -  person David Z    schedule 16.07.2010
comment
Ой! Действительно спасибо за все ответы. Очень хороши все.   -  person Eduardo    schedule 16.07.2010


Ответы (5)


Для известного модуля просто разделите их запятыми:

import lib1, lib2, lib3, lib4, lib5

Если вам действительно нужно программно импортировать на основе динамических переменных, буквальный перевод вашего рубина будет выглядеть так:

modnames = "lib1 lib2 lib3 lib4 lib5".split()
for lib in modnames:
    globals()[lib] = __import__(lib)

Хотя в вашем примере в этом нет необходимости.

person Brian    schedule 15.07.2010
comment
Обратите внимание, что первый фрагмент кода не соответствует рекомендациям Pep 8 python.org/dev/ peps/pep-0008/#imports - person Minion Jim; 11.07.2019

Попробуй это:

import lib1, lib2, lib3, lib4, lib5

Вы также можете изменить имя, под которым они импортируются, например:

import lib1 as l1, lib2 as l2, lib3, lib4 as l4, lib5
person John Howard    schedule 15.07.2010

Вы можете импортировать из строки, содержащей имя вашего модуля, с помощью функции __import__. .

requirements = [lib1, lib2, lib3, lib4, lib5]
for lib in requirements:
    x = __import__(lib)
person txwikinger    schedule 15.07.2010

Вы можете использовать __import__, если у вас есть список строк, представляющих модули, но, вероятно, будет чище, если вы последуете подсказке в документации и будете использовать importlib.import_module напрямую:

import importlib
requirements = [lib1, lib2, lib3, lib4, lib5]
imported_libs = {lib: importlib.import_module(lib) for lib in requirements}

Таким образом, у вас нет импортированных библиотек в качестве переменных, но вы можете получить к ним доступ через словарь imported_libs:

>>> requirements = ['sys', 'itertools', 'collections', 'pickle']
>>> imported_libs = {lib: importlib.import_module(lib) for lib in requirements}
>>> imported_libs
{'collections': <module 'collections' from 'lib\\collections\\__init__.py'>,
 'itertools': <module 'itertools' (built-in)>,
 'pickle': <module 'pickle' from 'lib\\pickle.py'>,
 'sys': <module 'sys' (built-in)>}

>>> imported_libs['sys'].hexversion
50660592

Вы также можете обновить свои globals, а затем использовать их, как если бы они были импортированы "обычно":

>>> globals().update(imported_libs)
>>> sys
<module 'sys' (built-in)>
person MSeifert    schedule 27.08.2017

если вы хотите многострочный:

from englishapps.multiple.mainfile import (
    create_multiple_,
    get_data_for_multiple
)
person Edgar Manukyan    schedule 16.12.2020