Jak zrobić wiele importów w Pythonie?

W Rubim, zamiast powtarzać słowo "require" ("import" w Pythonie) wiele razy, wykonuję

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

Iteruje więc nad zestawem "libs " I" require " (import) każdego z nich. Teraz piszę skrypt Pythona i chciałbym zrobić coś takiego. Czy istnieje sposób, Czy muszę napisać "import" dla wszystkich z nich.

Prosta "traduction" byłaby czymś w rodzaju poniższego kodu. W każdym razie, ponieważ Python nie importuje libs nazwanych jako struny, to nie działa.

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

Z góry dzięki

Author: Ben Hare, 2010-07-15

6 answers

Dla znanych modułów, po prostu oddziel je przecinkami:

import lib1, lib2, lib3, lib4, lib5

Jeśli naprawdę potrzebujesz programowo importować w oparciu o zmienne dynamiczne, dosłowne tłumaczenie Twojego Rubiego brzmiałoby:

modnames = "lib1 lib2 lib3 lib4 lib5".split()
for lib in modnames:
    globals()[lib] = __import__(lib)
Chociaż nie ma takiej potrzeby w twoim przykładzie.
 56
Author: Brian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-27 12:55:15

Spróbuj tego:

import lib1, lib2, lib3, lib4, lib5

Możesz również zmienić nazwę, pod którą są importowane, w ten sposób:

import lib1 as l1, lib2 as l2, lib3, lib4 as l4, lib5
 22
Author: John Howard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-15 22:35:44

import lib1, lib2, lib3, lib4, lib5

 9
Author: ykaganovich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-07-15 22:31:14

Możesz zaimportować z łańcucha zawierającego nazwę modułu używając __import__ funkcja.

requirements = [lib1, lib2, lib3, lib4, lib5]
for lib in requirements:
    x = __import__(lib)
 4
Author: txwikinger,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-27 12:45:19

Możesz użyć __import__, Jeśli masz listę łańcuchów reprezentujących Moduły, ale prawdopodobnie będzie to czystsze, jeśli zastosujesz się do podpowiedzi w dokumentacji i użyjesz importlib.import_module bezpośrednio:

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

Nie masz zaimportowanych bibliotek jako zmiennych dostępnych w ten sposób, ale możesz uzyskać do nich dostęp poprzez słownik 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

Możesz również zaktualizować swoje globals, a następnie użyć ich tak, jakby były importowane "normalnie":

>>> globals().update(imported_libs)
>>> sys
<module 'sys' (built-in)>
 3
Author: MSeifert,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-08-27 12:54:35

Jeśli chcesz multi-line:

from englishapps.multiple.mainfile import (
    create_multiple_,
    get_data_for_multiple
)
 1
Author: Edgar Manukyan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-12-16 16:54:56