Поиск…


Синтаксис

  • 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

Программный импорт

Python 2.x 2.7

Чтобы импортировать модуль через вызов функции, используйте модуль importlib (включенный в Python, начиная с версии 2.7):

import importlib
random = importlib.import_module("random")

Функция importlib.import_module() также импортирует подмодуль пакета напрямую:

collections_abc = importlib.import_module("collections.abc")

Для более старых версий Python используйте модуль imp .

Python 2.x 2.7

Используйте функции 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 для импорта:

  1. Импорт должен быть на отдельных линиях:

     from math import sqrt, ceil      # Not recommended
     from math import sqrt            # Recommended
     from math import ceil
    
  1. Закажите импорт в верхней части модуля следующим образом:

    • Импорт стандартных библиотек
    • Связанный импорт третьей стороны
    • Локальный импорт приложений / библиотек
  2. Следует избегать импорта подстановочных знаков, поскольку это приводит к путанице в именах в текущем пространстве имен. Если вы выполняете from module import * , может быть неясно, связано ли какое-либо имя в вашем коде с module или нет. Это вдвойне верно, если у вас есть несколько from module import * операторов from module import * .

  3. Избегайте использования относительного импорта; вместо этого используйте явный импорт.

Импорт подмодулей

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 :

Python 2.x 2.3
import math
math.pi = 3
print(math.pi)    # 3
reload(math)
print(math.pi)    # 3.141592653589793

Python 3


Функция reload переместилась в importlib :

Python 3.x 3.0
import math
math.pi = 3
print(math.pi)    # 3
from importlib import reload
reload(math)
print(math.pi)    # 3.141592653589793


Modified text is an extract of the original Stack Overflow Documentation
Лицензировано согласно CC BY-SA 3.0
Не связан с Stack Overflow