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