Автор оригинала: Nicholas Samuel.
Создание и импорт модулей в Python
Вступление
В Python модуль-это автономный файл с инструкциями и определениями Python. Например, file.py
, можно считать модулем с именем file
. Это отличается от пакета тем, что пакет представляет собой коллекцию модулей в каталогах, которые придают модулям структуру и иерархию.
Модули помогают нам разбивать большие программы на небольшие файлы, которые более управляемы. С модулями возможность повторного использования кода становится реальностью. Предположим, у нас есть функция, которая часто используется в различных программах. Мы можем определить эту функцию в модуле, а затем импортировать ее в различные программы без необходимости каждый раз копировать ее код.
В этой статье мы увидим, как создавать модули Python и как использовать их в коде Python.
Написание Модулей
Модуль-это просто файл Python с расширением .py
. Имя файла становится именем модуля. Внутри файла мы можем иметь определения и реализации классов, переменных или функций. Затем они могут быть использованы в других программах Python.
Давайте начнем с создания функции, которая просто печатает “Hello World”. Для этого создайте новый файл Python и сохраните его как hello.py
. Добавьте в файл следующий код:
def my_function(): print("Hello World")
Если вы запустите приведенный выше код, он ничего не вернет. Это потому, что мы не сказали программе ничего делать. Это правда, что мы создали функцию с именем my_function()
в коде, но мы не вызывали и не вызывали эту функцию. При вызове эта функция должна напечатать текст “Hello World”.
Теперь перейдите в тот же каталог, где вы сохранили вышеупомянутый файл, и создайте новый файл с именем main.py
. Добавьте в файл следующий код:
import hello hello.my_function()
Выход
Hello World
Функция была успешно вызвана. Мы начали с импорта модуля. Имя файла было hello.py
, следовательно, имя импортируемого модуля – hello
.
Кроме того, обратите внимание на синтаксис, который мы использовали для вызова функции. Это называется “точечной нотацией”, которая позволяет нам вызвать функцию, сначала указав имя модуля, а затем имя функции.
Однако это всего лишь один из способов импорта модуля и вызова функции. Мы могли бы сделать это следующим образом:
from hello import my_function my_function()
Выход
Hello World
В приведенном выше примере первая строка командует интерпретатору Python импортировать функцию с именем my_function
из модуля с именем hello
. В таком случае вам не нужно использовать точечную нотацию для доступа к функции, вы можете просто вызвать ее напрямую.
Однако в случае, когда наш модуль hello
имеет несколько функций, оператор from hello import my_function
не будет импортировать все функции hello
в нашу программу, а только my_function
. Если вы попытаетесь получить доступ к любой другой функции, будет сгенерирована ошибка. Вы должны импортировать весь модуль или импортировать каждую отдельную функцию, чтобы использовать их.
Мы можем определить переменную внутри модуля, которая затем может быть использована другими модулями. Чтобы продемонстрировать это, откройте файл hello.py
и добавьте к нему следующий код:
def my_function(): print("Hello World") # The variable that'll be used in other modules name = "Nicholas"
Теперь откройте main.py
файл и измените его следующим образом:
import hello hello.my_function() print(hello.name)
Выход
Hello World Nicholas
Мы успешно вызвали как функцию, так и переменную, определенную в модуле, так как импортировали весь модуль, а не только функцию my_function ()
.
Ранее мы говорили, что можем определить класс внутри модуля. Давайте посмотрим, как это сделать в следующем примере. Откройте hello.py
файл и измените его следующим образом:
def my_function(): print("Hello World") # Defining our variable name = "Nicholas" # Defining a class class Student: def __init__(self, name, course): self.course = course self.name = name def get_student_details(self): print("Your name is " + self.name + ".") print("You are studying " + self.course)
Здесь мы определили класс с именем Student
. В этом классе были определены две переменные: name
и course
. В нем также был определен метод get_student_details ()
, который выводит данные студента на консоль.
Теперь откройте файл main.py
и изменить его следующим образом:
import hello hello.my_function() print(hello.name) nicholas = hello.Student("Nicholas", "Computer Science") nicholas.get_student_details()
Выход
Hello World Nicholas Your name is Nicholas. You are studying Computer Science
В приведенном выше сценарии мы снова использовали точечную нотацию для создания объекта класса student
из модуля hello
. Затем мы использовали функцию get_student_details()
для получения сведений о студенте.
Хотя модули в основном состоят из определений классов (в большинстве случаев), они также могут запускать свой собственный код при импорте. Чтобы продемонстрировать это, давайте изменим hello.py
файл, где у нас есть определение функции my_function()
, вместе с вызовом функции:
def my_function(): print("Hello World") my_function()
Теперь откройте файл main.py
и удалить все строки, кроме следующих:
import hello
Выход
Hello World
Приведенный выше вывод показывает, что мы определили и вызвали функцию внутри модуля. Когда модуль импортируется, он непосредственно возвращает результат из функции, не вызывая ее. Такое поведение не всегда желательно, но оно полезно для определенных случаев использования, таких как предварительная загрузка данных из кэша при импорте модуля.
Импорт всех объектов Модуля
Чтобы импортировать все объекты (функции, переменные, классы и т. Д.) Из модуля, мы можем использовать оператор import *
. Например, для импорта всех объектов, содержащихся в модуле hello
, мы можем использовать следующий оператор:
from hello import *
После добавления приведенного выше оператора в программу мы сможем использовать любую функцию, переменную или класс, содержащиеся в модуле hello
, без префикса hello
.
Доступ к модулю из другого пути
В Python модули используются более чем в одном проекте. Следовательно, нет смысла хранить ваши модули в каталоге одного из проектов, так как другие проекты не смогут использовать его так же легко.
У вас есть несколько вариантов, когда вам нужно получить доступ к модулю, который не хранится в том же каталоге, что и ваша программа. Давайте обсудим их в следующих нескольких разделах:
Добавление путей
Чтобы импортировать модуль из другого пути, вам сначала нужно импортировать модуль sys
, а также любые другие модули Python, которые вы хотели бы использовать в своей программе.
Модуль sys
предоставляется стандартной библиотекой Python и предоставляет функции и параметры, специфичные для конкретной системы. Функция path.append()
из модуля sys
может быть использована для добавления пути модуля в текущий проект.
Чтобы продемонстрировать это, вырежьте hello.py
файл из каталога, в котором у вас есть файл main.py
. Вставьте его в другой каталог. В моем случае я вставил его в каталог “F:\Python.”
Теперь откройте файл main.py
, импортируйте модуль sys
и укажите путь, по которому интерпретатор Python будет искать файлы. Это показано ниже:
import sys sys.path.append('F:/Python/') import hello
Выход
Hello World
В приведенном выше скрипте строка sys.path.append('F:/Python/')
указывает интерпретатору Python включить этот путь в список путей, которые будут искать при импорте модулей.
Добавление модуля в Python Path
Описанный выше метод работает только в том случае, если вы импортируете модуль sys
. Если вы не импортируете модуль sys
и не укажете путь к нему, то возникнет ошибка. Чтобы сделать модуль доступным для всей системы, вы можете добавить его в путь, где Python обычно проверяет наличие модулей и пакетов. Таким образом, вам не нужно будет импортировать модуль sys
и указывать путь к модулю, как это было сделано в предыдущем разделе.
Прежде чем делать что-либо еще, вы должны сначала определить путь, по которому Python ищет модули и пакеты. Просто откройте командную строку вашей операционной системы и выполните команду python
. Это приведет вас к терминалу Python.
Импортируйте модуль sys
следующим образом:
import sys
Затем вы можете выполнить следующую команду, чтобы распечатать путь:
print(sys.path)
Выходные данные будут содержать по крайней мере один системный путь. Если вы делаете это из среды программирования, вы получите несколько путей. В моем случае я получил следующее:
$ python Python 2.7.10 (default, Oct 23 2015, 19:19:21) [GCC 4.2.1 Compatible Apple LLVM 7.0.0 (clang-700.0.59.5)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import sys >>> print(sys.path) ['', '/Library/Python/2.7/site-packages/six-1.10.0-py2.7.egg', '/Library/Python/2.7/site-packages/cffi-1.2.1-py2.7-macosx-10.9-intel.egg', '/Library/Python/2.7/site-packages/pycparser-2.14-py2.7.egg', '/Library/Python/2.7/site-packages/virtualenv-13.1.2-py2.7.egg', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python27.zip', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-darwin', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/plat-mac/lib-scriptpackages', '/System/Library/Frameworks/Python.framework/Versions/2.7/Extras/lib/python', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-tk', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-old', '/System/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/lib-dynload', '/Library/Python/2.7/site-packages'] >>>
Ваша цель должна состоять в том, чтобы найти тот, который вы используете в настоящее время. Вы должны искать что-то вроде следующего:
/Library/Python/2.7/site-packages
Переместите свой hello.py
файл к пути. После этого вы сможете импортировать модуль hello
из любого каталога обычным способом, как показано ниже:
import hello
Выход
Hello World
Вывод
На этом статья заканчивается. Модуль-это просто файл Python с набором переменных и определений функций. Модуль облегчает повторное использование кода, поскольку вы можете определить функцию в модуле и вызвать ее из разных программ вместо того, чтобы определять функцию в каждой программе. Хотя модуль в основном используется для определения функций и классов, он также может экспортировать переменные и экземпляры классов.