Эта статья была впервые опубликована вЗнай почти
При использовании python часто задействуются вызовы библиотек, что требует базовых знаний о модулях. Эта статья разделена на следующие части
- Концептуальная записка
- Простой вызов модуля
- импорт пакета
- особый
__init__.py
документ - Путь поиска импортированных модулей
__all__
- Абсолютные и относительные ссылки
- сущность запуска импорта
if __name__ == '__main__'
Концептуальная записка
Здесь, чтобы прояснить концептуальные различия между модулями, библиотеками и пакетами в python.
- Модуль на самом деле представляет собой py-файл, который определяет некоторые функции, классы, переменные и т. д.
- Пакет — это папка, образованная совокупностью нескольких модулей, которая может содержать несколько py-файлов или вложенных папок.
- Библиотеки относятся к другим языкам программирования и относятся к набору кодов, выполняющих определенные функции.В python это модули и пакеты.
Простой вызов модуля
Например, у нас естьtrymodule
папка, содержащаяfirst.py
файл, содержимое файла следующее
a = 1
def myfun(s):
print(s + 1)
существуетtrymodule
Откройте окно командной строки в папкеpython
Войдите в интерактивный режим командной строки
>>> import first
>>> a
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'a' is not defined
>>> first.a
1
>>> first.myfun(2)
3
Итак, файл first.py — это модуль, который можно использовать сimport
Импорт, переменные в нем должны быть использованыfirst.
префикс для ссылки, если вы не хотите использовать этот префикс, вы можете сделать это
>>> from first import a
>>> a
1
Другие варианты использования следующие
# 重命名
>>> from first import myfun as addone
>>> addone(4)
5
# 导入模块中全部变量
>>> from first import *
>>> myfun(2)
3
# 一次导入多个变量
>>> from first import a, myfun
>>> a
1
импорт пакета
Создайте новый в папке trymodulefolder1
папка, мы хотимfolder1
Папка становится пакетом. новая папкаabcd.py
файл, содержимое файла следующее
b = 2
class Myclass:
def __init__(self, name, age):
self.name = name
self.age = age
def get_info(self):
print('my name is {name} and age is {age}'.format(name = self.name, age = self.age))
в это время вfolder1
создать новую папку__init__.py
файл, иначе программа будет рассматривать эту папку как обычную папку, а не как пакет. это__init__.py
В файле ничего нельзя заполнить.
Структура файла следующая
trymodule
│ first.py
├───folder1
│ │ abcd.py
│ │ __init__.py
мы по-прежнемуtrymodule
Откройте командную строку в папке и войдите в интерактивный режим Python.
Давайте рассмотрим следующие методы импорта
>>> import folder1
>>> folder1.abcd.b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: module 'folder1' has no attribute 'abcd'
>>> from folder1 import abcd
>>> bob = abcd.Myclass(name = 'Bob', age = 20)
>>> bob.name
'Bob'
>>> bob.get_info()
my name is Bob and age is 20
>>> from folder1.abcd import b
>>> b
2
>>> import folder1.abcd
>>> abcd.b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'abcd' is not defined
>>> folder1.abcd.b
2
>>> import folder1.abcd as aa
>>> aa.b
2
Уведомление:
- Просто пакет импорта не может случайно использовать находящиеся в нем модули, и его нужно импортировать на уровень конкретных модулей или переменных.
- Доступно между папками и файлами
.
также можно использоватьfrom import
формате, а файл и переменные в нем можно использовать толькоfrom import
формат, т.е. не можетimport folder1.abcd.b
особый__init__.py
документ
__init__.py
Файл на самом деле является специальным файлом, который эквивалентен модулю с именем папки1, то есть, если вы используетеimport folder1
тогда можешь позвонить__init__.py
Переменные, определенные в файле file.
Буду__init__.py
Файл пишется так
from folder1.abcd import b
c = 3
Откройте командную строку в папке trymodule и войдите в интерактивный режим Python.
>>> import folder1
>>> folder1.c
3
>>> folder1.b
2
>>> from folder1 import b
>>> b
2
Ранееfrom folder1.abcd import b
,использовать__init__.py
Файл может импортировать некоторые часто используемые переменные для облегчения вызова.
Еще две вещи, на которые следует обратить внимание
-
__init__.py
Когда файл будет записан, если вы хотите импортировать переменные в другие модули, даже если__init__.py
документы иabcd.py
файлы находятся в одной папке и не могутfrom abcd import b
, начал писать бумажки приходят с abcd, начинается с названия пакета. - Не нужно создавать заново созданную вложенную папку в папке Folder1
__init__.py
Файл можно назвать как модуль, но обычно необходимо создать новый файл, чтобы легко импортировать общие переменные.
Путь поиска импортированных модулей
использоватьimport hello
, python будет искатьhello.py
файлы, порядок поиска следующий
- Первый поиск встроенных модулей
hello
(Поэтому определяемое нами имя модуля не должно совпадать со встроенным модулем) - Если встроенного модуля нет, посмотрите, есть ли они в следующих каталогах
>>> import sys
>>> sys.path
['', 'C:\\Program Files\\Anaconda3\\python35.zip', 'C:\\Program Files\\Anaconda3\\DLLs', 'C:\\Program Files\\Anaconda3\\lib', 'C:\\Program Files\\Anaconda3', 'C:\\Program Files\\Anaconda3\\lib\\site-packages', 'C:\\Program Files\\Anaconda3\\lib\\site-packages\\Sphinx-1.4.6-py3.5.egg', 'C:\\Program Files\\Anaconda3\\lib\\site-packages\\snownlp-0.12.3-py3.5.egg', 'C:\\Program Files\\Anaconda3\\lib\\site-packages\\win32', 'C:\\Program Files\\Anaconda3\\lib\\site-packages\\win32\\lib', 'C:\\Program Files\\Anaconda3\\lib\\site-packages\\Pythonwin', 'C:\\Program Files\\Anaconda3\\lib\\site-packages\\setuptools-27.2.0-py3.5.egg']
первый из которых''
Указывает текущий рабочий путь, мы можем видеть путь, где находится установленный сторонний пакет ('C:\\Program Files\\Anaconda3\\lib\\site-packages'
) тоже есть в этом списке, так что где бы ни был рабочий путь, эти пакеты будут найдены.
Если вы хотите добавить путь поиска, вы можете обратиться кэта статья
__all__
Прежде всего, понятно,import *
нельзя импортировать имена переменных, начинающиеся с подчеркивания
__init__.py
Содержимое файла изменяется следующим образом
from folder1.abcd import b
c = 3
_e = 4
В интерактивном режиме Python
>>> from folder1 import *
>>> c
3
>>> _e
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name '_e' is not defined
И если указанный импорт в порядке
>>> from folder1 import c
>>> c
3
>>> from folder1 import _e
>>> _e
4
если определено__all__
,ноimport *
Вы можете импортировать переменную, начиная с подчеркнутого
__init__.py
Содержимое файла изменяется следующим образом
from folder1.abcd import b
__all__ = ['c', '_e']
c = b + 1
_e = 4
В интерактивном режиме Python
>>> from folder1 import *
>>> b
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
NameError: name 'b' is not defined
>>> c
3
>>> _e
4
видимыйimport *
будет только импортировать__all__
Переменная, указанная в , независимо от того, начинается ли она с символа подчеркивания. Это ограничение предотвращаетimport *
Команда импортирует слишком много переменных, чтобы загрязнить пространство имен, отфильтруйте некоторые промежуточные переменные, такие какb
Абсолютные и относительные ссылки
в питонеimport
Существует два типа: абсолютная ссылка и относительная ссылка. Разница между ними заключается в том, как расположен ссылочный модуль при ссылке на модуль.
- Абсолютная ссылка заключается в явном указании файла (папки) самого высокого уровня и использовании
.
Подключитесь, а затем перейдите к модулю, на который нужно сослаться. Все наши варианты использования выше являются абсолютными ссылками. - Относительная ссылка предназначена для указания относительного положения модуля, на который нужно сослаться, и текущего файла,
.
Указывает родительский файл
В этой файловой структуре
trymodule
│ first.py
├───folder1
│ │ abcd.py
│ │ __init__.py
записывать__init__.py
файл, на который следует ссылатьсяabcd.py
переменная в файле
- абсолютные ссылки
from folder1.abcd import b
- Относительные ссылки
from .abcd import b
В относительных ссылках.
ссылается на родительский файл (который также имеетfrom . import xxx
Применение),.xxx
относится к тому же слою файлов,..xxx
находится на том же уровне, что и родительская папкаxxx
файл (еще один.
Указывает на еще один слой вверх)
Какой из них вы обычно используете?
После python3 официальная рекомендация — использовать метод абсолютной ссылки, только когда отношения между файлами в модуле очень сложны, относительная ссылка будет иметь преимущество.
сущность запуска импорта
использоватьimport
заявление, чтобы прояснить две вещи
(1) При выполнении команды импорта модуля она сначала проверяет, входит ли импортируемый модуль в число существующих модулей, и если да, то пропускает его.import
. Поэтому модули, ссылающиеся друг на друга, не вызовут бесконечных циклов.
Используйте следующий метод для просмотра текущих импортированных модулей
import sys
sys.modules
Результат — словарь, ключ — имя модуля, а значение — путь, по которому находится файл
(2)import
Заявление и выполнение файла
В этой файловой структуре
trymodule
│ first.py
├───folder1
│ │ abcd.py
│ │ __init__.py
folder1 — это пакет, abcd — это модуль
-
import folder1
Просто импортируйте пакет, что эквивалентно выполнению__init__.py
документ -
from folder import abcd
затем казнен__init__.py
файл файл сabcd.py
документ -
from folder1.abcd import b
Фактически реализовано__init__.py
файл файл сabcd.py
документ
(Чтобы знать, что выполняется, вы можете добавить в эти файлыprint
оператор, чтобы увидеть, напечатан ли результат)
Зная этот принцип реализации, можно лучше понять некоторые выводы, полученные ранее.
- первый в
__init__.py
Когда в файле ничего нет,import folder1
нельзя назватьabcd
переменные в модуле, потому что это эквивалентно запуску пустого файла без импорта всего пакета в рабочую область -
abcd
определено в модулеprint
После заявления,import
Дважды, только в первый раз будетprint
Если значение отсутствует, это означает, что вторая проверка того, что модуль был импортирован, игнорирует этоimport
Заказ
Для получения более подробной информации см.эта статья
if __name__ == '__main__'
Мы часто находим в чужом кодеif __name__ == '__main__'
, чтобы понять, что он делает, давайте посмотрим на следующий пример
Создайте новый файл new.py в папке folder1 с содержимым
print(__name__)
Откройте командную строку в папке folder1 и введите
python new.py
Возвращаемый результат__main__
Откройте командную строку в папке trymodule и войдите в интерактивный режим Python.
>>> from folder1 import new
folder1.new
>>> print(__name__)
__main__
>>> print(new.__name__)
folder1.new
Приведенные выше результаты теста показывают, что запуск файла напрямую иimport
Файлы разные, разница заключается в двух__name__
Переменные бывают разные.__name__
Переменная — это специальная переменная, которая соответствует единице при запуске каждого файла py.__name__
переменная, значение этой переменной можно просмотреть даже в интерактивном режиме.
такif __name__ == '__main__'
Легко понять рольimport
Следующий код не выполняется при непосредственном выполнении файла, а следующий код выполняется только при непосредственном выполнении файла. Это обычный способ записи, если вы не боитесь, что файл будетimport
, можно обойтись и без этого.
Добро пожаловать, чтобы обратить внимание на мою колонку знаний
Домашняя коробка:программирование на питоне
Каталог столбцов:содержание
Примечания к выпуску:Примечания к выпуску программного обеспечения и пакетов