Python Language
Импорт модулей
Поиск…
Синтаксис
- import module_name
- import module_name.submodule_name
- from module_name import *
- от module_name импорта submodule_name [, class_name, ИМЯ_ФУНКЦИИ, ... и т.д.]
- from module_name import some_name как new_name
- от module_name.submodule_name импорта class_name [, ИМЯ_ФУНКЦИИ, ... и т.д.]
замечания
Импорт модуля позволит Python оценить весь код верхнего уровня в этом модуле, чтобы он изучил все функции, классы и переменные, которые содержит модуль. Если вы хотите, чтобы ваш модуль был импортирован где-то в другом месте, будьте осторожны с кодом верхнего уровня и инкапсулируйте его в if __name__ == '__main__':
если вы не хотите, чтобы он выполнялся при импорте модуля.
Импорт модуля
Используйте оператор import
:
>>> import random
>>> print(random.randint(1, 10))
4
import module
импортирует модуль, а затем позволяет ссылаться на его объекты - значения, функции и классы, например, - используя синтаксис module.name
. В приведенном выше примере импортируется random
модуль, который содержит функцию randint
. Поэтому, импортируя random
вы можете вызвать randint
с random.randint
.
Вы можете импортировать модуль и назначить его другому имени:
>>> import random as rn
>>> print(rn.randint(1, 10))
4
Если файл python main.py
находится в той же папке, что и custom.py
. Вы можете импортировать его следующим образом:
import custom
Также можно импортировать функцию из модуля:
>>> from math import sin
>>> sin(1)
0.8414709848078965
Чтобы импортировать определенные функции глубже в модуль, оператор точки может использоваться только с левой стороны ключевого слова import
:
from urllib.request import urlopen
В python у нас есть два способа вызова функции с верхнего уровня. Один - import
а другой - from
. Мы должны использовать import
если у нас есть возможность столкновения имен. Предположим , что мы имеем hello.py
файл и world.py
файлы , имеющие ту же самую функцию с именем function
. Тогда import
заявка будет работать хорошо.
from hello import function
from world import function
function() #world's function will be invoked. Not hello's
В общем случае import
предоставит вам пространство имен.
import hello
import world
hello.function() # exclusively hello's function will be invoked
world.function() # exclusively world's function will be invoked
Но если вы уверены, что в вашем проекте нет никакого имени функции, которую вы должны использовать from
инструкции
Несколько импорта могут быть сделаны в одной строке:
>>> # Multiple modules
>>> import time, sockets, random
>>> # Multiple functions
>>> from math import sin, cos, tan
>>> # Multiple constants
>>> from math import pi, e
>>> print(pi)
3.141592653589793
>>> print(cos(45))
0.5253219888177297
>>> print(time.time())
1482807222.7240417
Ключевые слова и синтаксис, показанные выше, также могут использоваться в комбинациях:
>>> from urllib.request import urlopen as geturl, pathname2url as path2url, getproxies
>>> from math import factorial as fact, gamma, atan as arctan
>>> import random.randint, time, sys
>>> print(time.time())
1482807222.7240417
>>> print(arctan(60))
1.554131203080956
>>> filepath = "/dogs/jumping poodle (december).png"
>>> print(path2url(filepath))
/dogs/jumping%20poodle%20%28december%29.png
Импортирование определенных имен из модуля
Вместо импорта полного модуля вы можете импортировать только указанные имена:
from random import randint # Syntax "from MODULENAME import NAME1[, NAME2[, ...]]"
print(randint(1, 10)) # Out: 5
from random
, потому что интерпретатор python должен знать, из какого ресурса он должен импортировать функцию или класс, а import randint
указывает функцию или класс.
Другой пример ниже (аналогично приведенному выше):
from math import pi
print(pi) # Out: 3.14159265359
Следующий пример вызовет ошибку, потому что мы не импортировали модуль:
random.randrange(1, 10) # works only if "import random" has been run before
Выходы:
NameError: name 'random' is not defined
Интерпретатор python не понимает, что вы имеете в виду со random
. Он должен быть объявлен путем добавления import random
примера к примеру:
import random
random.randrange(1, 10)
Импорт всех имен из модуля
from module_name import *
например:
from math import *
sqrt(2) # instead of math.sqrt(2)
ceil(2.7) # instead of math.ceil(2.7)
Это импортирует все имена, определенные в math
модуле, в глобальное пространство имен, кроме имен, начинающихся с подчеркивания (что указывает на то, что автор считает, что он предназначен только для внутреннего использования).
Предупреждение . Если функция с тем же именем уже была определена или импортирована, она будет перезаписана . Почти всегда импортировать только определенные имена from math import sqrt, ceil
рекомендуется использовать from math import sqrt, ceil
:
def sqrt(num):
print("I don't know what's the square root of {}.".format(num))
sqrt(4)
# Output: I don't know what's the square root of 4.
from math import *
sqrt(4)
# Output: 2.0
Помеченный импорт разрешен только на уровне модуля. Попытки выполнить их в определениях классов или функций приводят к SyntaxError
.
def f():
from math import *
а также
class A:
from math import *
оба терпят неудачу:
SyntaxError: import * only allowed at module level
Специальная переменная __all__
Модули могут иметь специальную переменную с именем __all__
чтобы ограничить, какие переменные импортируются при использовании from mymodule import *
.
Учитывая следующий модуль:
# mymodule.py
__all__ = ['imported_by_star']
imported_by_star = 42
not_imported_by_star = 21
Только imported_by_star
импортируется при использовании from mymodule import *
:
>>> from mymodule import *
>>> imported_by_star
42
>>> not_imported_by_star
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'not_imported_by_star' is not defined
Однако not_imported_by_star
можно импортировать явно:
>>> from mymodule import not_imported_by_star
>>> not_imported_by_star
21
Программный импорт
Чтобы импортировать модуль через вызов функции, используйте модуль importlib
(включенный в Python, начиная с версии 2.7):
import importlib
random = importlib.import_module("random")
Функция importlib.import_module()
также импортирует подмодуль пакета напрямую:
collections_abc = importlib.import_module("collections.abc")
Для более старых версий Python используйте модуль imp
.
Используйте функции imp.find_module
и imp.load_module
для выполнения программного импорта.
Взято из стандартной библиотечной документации
import imp, sys
def import_module(name):
fp, pathname, description = imp.find_module(name)
try:
return imp.load_module(name, fp, pathname, description)
finally:
if fp:
fp.close()
НЕ используйте __import__()
для программного импорта модулей! Существуют тонкие детали, связанные с sys.modules
, аргументом fromlist
и т. sys.modules
, fromlist
легко упускать из вида, которые importlib.import_module()
обрабатывает для вас.
Импорт модулей из произвольного расположения файловой системы
Если вы хотите импортировать модуль, который еще не существует в качестве встроенного модуля в стандартной библиотеке Python или в качестве побочного пакета, вы можете сделать это, добавив путь к каталогу, в котором ваш модуль находится в sys.path
. Это может быть полезно, когда на хосте существует несколько сред python.
import sys
sys.path.append("/path/to/directory/containing/your/module")
import mymodule
Важно, чтобы вы добавили путь к каталогу, в котором mymodule
найден mymodule
, а не по пути к самому модулю.
Правила PEP8 для импорта
Некоторые рекомендуемые правила стиля PEP8 для импорта:
Импорт должен быть на отдельных линиях:
from math import sqrt, ceil # Not recommended from math import sqrt # Recommended from math import ceil
Закажите импорт в верхней части модуля следующим образом:
- Импорт стандартных библиотек
- Связанный импорт третьей стороны
- Локальный импорт приложений / библиотек
Следует избегать импорта подстановочных знаков, поскольку это приводит к путанице в именах в текущем пространстве имен. Если вы выполняете
from module import *
, может быть неясно, связано ли какое-либо имя в вашем коде сmodule
или нет. Это вдвойне верно, если у вас есть несколькоfrom module import *
операторовfrom module import *
.Избегайте использования относительного импорта; вместо этого используйте явный импорт.
Импорт подмодулей
from module.submodule import function
Это импортирует function
из module.submodule
.
Функция __import __ ()
Функция __import__()
может использоваться для импорта модулей, где имя известно только во время выполнения
if user_input == "os":
os = __import__("os")
# equivalent to import os
Эта функция также может использоваться для указания пути файла к модулю
mod = __import__(r"C:/path/to/file/anywhere/on/computer/module.py")
Повторный импорт модуля
При использовании интерактивного интерпретатора вам может понадобиться перезагрузить модуль. Это может быть полезно, если вы редактируете модуль и хотите импортировать новейшую версию, или если вы обезврежили элемент существующего модуля и хотите вернуть свои изменения.
Обратите внимание, что вы не можете просто повторно import
модуль для возврата:
import math
math.pi = 3
print(math.pi) # 3
import math
print(math.pi) # 3
Это объясняется тем, что интерпретатор регистрирует каждый импортируемый модуль. И когда вы пытаетесь переименовать модуль, интерпретатор видит его в регистре и ничего не делает. Таким образом, сложный способ reimport - использовать import
после удаления соответствующего элемента из реестра:
print(math.pi) # 3
import sys
if 'math' in sys.modules: # Is the ``math`` module in the register?
del sys.modules['math'] # If so, remove it.
import math
print(math.pi) # 3.141592653589793
Но есть более простой и простой способ.
Python 2
Используйте функцию reload
:
import math
math.pi = 3
print(math.pi) # 3
reload(math)
print(math.pi) # 3.141592653589793
Python 3
Функция reload
переместилась в importlib
:
import math
math.pi = 3
print(math.pi) # 3
from importlib import reload
reload(math)
print(math.pi) # 3.141592653589793