В этой главе мы собираемся изучить модули Python.
Введение
До сих пор весь код, который мы писали в интерпретаторе Python, терялся при выходе из интерпретатора. Но когда люди пишут большие программы, они обычно разбивают свой код на несколько разных файлов для удобства использования, отладки и читаемости. В Python мы используем модули для достижения таких целей. Модули — это не что иное, как файлы с определениями и выражениями на Python. Имя модуля, который нужно импортировать, совпадает с именем файла Python без расширения .py.
Имя модуля можно найти, обратившись к переменной __name__. Это глобальная переменная.
Теперь мы рассмотрим, как работают модули. Создайте файл с именем bars.py. Содержимое файла приведено ниже.
"""
Модуль Bars
============
Это пример модуля, который предоставляет различные способы печати строк.
"""
def starbar(num):
"""Печатает строку с *
:arg num: Длина строки
"""
print('*' * num)
def hashbar(num):
"""Печатает строку с #
:arg num: Длина строки
"""
print('#' * num)
def simplebar(num):
"""Печатает строку с -
:arg num: Длина строки
"""
print('-' * num)
Теперь мы запустим интерпретатор Python и импортируем наш модуль.
>>> import bars
>>>
Это импортирует модуль bars. Мы должны использовать имя модуля для доступа к функциям внутри модуля.
>>> bars.hashbar(10)
##########
>>> bars.simplebar(10)
----------
>>> bars.starbar(10)
**********
Импортирование модулей
Существуют различные способы импортирования модулей. Мы уже видели один из способов. Вы даже можете импортировать выбранные функции из модулей. Для этого:
>>> from bars import simplebar, starbar
>>> simplebar(20)
--------------------
Предупреждение
Никогда не делайте from module import * Прочитайте эту ссылку для получения дополнительной информации.
Подмодули
Внутри модуля может быть много подмодулей. Директория с файлом __init__.py также может использоваться как модуль, и все файлы .py внутри неё становятся подмодулями.
$ tree mymodule
mymodule
|-- bars.py
|-- __init__.py
`-- utils.py
В этом примере mymodule — это имя модуля, а bars и utils — два подмодуля в нём. Вы можете создать пустой файл __init__.py с помощью команды touch.
$ touch mymodule/__init__.py
__all__ в __init__.py
Если файл __init__.py содержит список под названием __all__, то только имена, перечисленные там, будут публичными. Так, если файл __init__.py модуля mymodule содержит следующее:
from mymodule.bars import simplebar
__all__ = [simplebar, ]
Тогда из модуля mymodule будет доступен только simplebar.
Примечание
from mymodule import * будет работать только для объектов уровня модуля, попытка использовать его для импорта функций или классов вызовет синтаксическую ошибку.
Модули по умолчанию
Теперь ваша установка Python поставляется с различными модулями, установленными по умолчанию, вы можете использовать их по мере необходимости и устанавливать новые модули для любых других специальных целей. В следующих нескольких примерах мы рассмотрим множество примеров на эту тему.
>>> help()
Добро пожаловать в утилиту помощи Python 3.5!
Если вы впервые используете Python, вам определенно стоит ознакомиться
с руководством на сайте http://docs.python.org/3.5/tutorial/.
Введите имя любого модуля, ключевого слова или темы, чтобы получить помощь по написанию
программ на Python и использованию модулей Python. Чтобы выйти из этой утилиты помощи и
вернуться к интерпретатору, просто введите "quit".
Чтобы получить список доступных модулей, ключевых слов, символов или тем, введите
"modules", "keywords", "symbols" или "topics". Каждый модуль также сопровождается
одной строкой, описывающей его назначение; чтобы вывести модули, имя
или описание которых содержит заданную строку, например "spam", введите "modules spam".
help> modules
Приведенный выше пример показывает, как получить список всех установленных модулей в вашей системе. Я не привожу их здесь, так как это большой список в моей системе :)
Вы также можете использовать функцию help() в интерпретаторе для поиска документации по любому модулю/классу. Например, если вы хотите узнать все доступные методы для строк, вы можете использовать следующий метод
>>> help(str)
Модуль os
os
модуль предоставляет функциональность, зависящую от операционной системы. Вы можете импортировать его с помощью следующего оператора импорта.
>>> import os
Функция getuid() возвращает идентификатор эффективного пользователя текущего процесса.
>>> os.getuid()
500
Функция getpid() возвращает идентификатор текущего процесса. getppid() возвращает идентификатор родительского процесса.
>>> os.getpid()
16150
>>> os.getppid()
14847
Функция uname() возвращает различную информацию, идентифицирующую операционную систему, в Linux она возвращает детали, которые можно получить с помощью команды uname. Возвращаемый объект — это кортеж, (sysname, nodename, release, version, machine)
>>> os.uname()
('Linux', 'd80', '2.6.34.7-56.fc13.i686.PAE', '#1 SMP Wed Sep 15 03:27:15 UTC 2010', 'i686')
Функция getcwd() возвращает текущий рабочий каталог. chdir(path) изменяет текущий рабочий каталог на путь. В примере мы сначала видим текущий каталог, который является моим домашним каталогом, и изменяем текущий каталог на /tmp, а затем снова проверяем текущий каталог.
>>> os.getcwd()
'/home/kushal'
>>> os.chdir('/tmp')
>>> os.getcwd()
'/tmp'
Итак, давайте использовать другую функцию, предоставляемую модулем os, и создадим нашу собственную функцию для перечисления всех файлов и каталогов в любом заданном каталоге.
def view_dir(path='.'):
"""
Эта функция выводит все файлы и каталоги в заданном каталоге.
:args path: Путь к каталогу, по умолчанию текущий каталог
"""
names = os.listdir(path)
names.sort()
for name in names:
print(name, end =' ')
Использование примера view_dir.
>>> view_dir('/')
.readahead bin boot dev etc home junk lib lib64 lost+found media mnt opt
proc root run sbin srv sys tmp usr var
Существует множество других очень полезных функций, доступных в модуле OS, о них вы можете прочитать здесь
Модуль Requests
requests — это модуль Python, который изменил способ написания кода для множества проектов. Он помогает вам выполнять HTTP GET или POST запросы очень просто и элегантно. Это сторонний модуль, что означает, что вам нужно установить его из пакетов вашего дистрибутива операционной системы, он не поставляется по умолчанию.
pip install requests
Приведенная выше команда установит версию модуля requests для Python3 в вашей системе.
Получение простых веб-страниц
Вы можете использовать метод get для получения любого сайта.
>>> import requests
>>> req = requests.get('http://google.com')
>>> req.status_code
200
Атрибут text содержит HTML, возвращенный сервером.
Используя эти знания, давайте напишем команду, которая может загрузить заданный файл (URL) из Интернета.
#!/usr/bin/env python3
import os
import os.path
import requests
def download(url):
'''Загружает заданный URL и сохраняет его в текущую директорию.
:arg url: URL файла для загрузки.
'''
req = requests.get(url)
# Сначала проверим отсутствие файлов.
if req.status_code == 404:
print('Файл не найден по адресу %s' % url)
return
filename = url.split('/')[-1]
with open(filename, 'wb') as fobj:
fobj.write(req.content)
print("Загрузка завершена.")
if __name__ == '__main__':
url = input('Введите URL:')
download(url)
Здесь мы использовали что-то новое: когда имя модуля __main__, только тогда запрашиваем у пользователя ввод и загружаем заданный URL. Это также предотвращает выполнение этого кода, когда другой Python-код импортирует этот файл как модуль.
Чтобы узнать больше о модуле requests, посетите их отличную документацию .
Вы можете модифицировать приведенную выше программу, чтобы сделать её более удобной для пользователя. Например, вы можете проверить, существует ли уже заданное имя файла в текущей директории или нет. Используйте модуль os.path
для этого.
Получение простых веб-страниц
Вы можете использовать метод get для получения любого сайта.
>>> import requests
>>> req = requests.get('http://google.com')
>>> req.status_code
200
Атрибут text содержит HTML, возвращенный сервером.
Используя эти знания, давайте напишем команду, которая может загрузить заданный файл (URL) из интернета.
#!/usr/bin/env python3
import os
import os.path
import requests
def download(url):
'''Загружает заданный URL и сохраняет его в текущую директорию.
:arg url: URL файла для загрузки.
'''
req = requests.get(url)
# Сначала проверим отсутствие файлов.
if req.status_code == 404:
print('Файл не найден по адресу %s' % url)
return
filename = url.split('/')[-1]
with open(filename, 'wb') as fobj:
fobj.write(req.content)
print("Загрузка завершена.")
if __name__ == '__main__':
url = input('Введите URL:')
download(url)
Здесь мы использовали что-то новое: когда имя модуля __main__, только тогда запрашиваем ввод пользователя и загружаем заданный URL. Это также предотвращает выполнение этого кода, когда другой Python-код импортирует этот файл как модуль.
Чтобы узнать больше о модуле requests, посетите их отличную документацию .
Вы можете изменить приведенную выше программу, чтобы сделать ее более удобной для пользователя. Например, вы можете проверить, существует ли уже заданное имя файла в текущей директории или нет. Используйте модуль os.path
для этого.
Аргументы командной строки
Помните вашу команду ls, вы можете передавать различные опции в качестве аргументов командной строки. Вы можете сделать это и для вашего приложения .. важно::. Прочитайте это руководство , чтобы узнать об этом.
TAB-дополнение в вашем интерпретаторе Python
Сначала создайте файл как ~/.pythonrc и включите в него следующее:
import rlcompleter, readline
readline.parse_and_bind('tab: complete')
history_file = os.path.expanduser('~/.python_history')
readline.read_history_file(history_file)
import atexit
atexit.register(readline.write_history_file, history_file)
Затем просто экспортируйте переменную PYTHONSTARTUP, указывающую на этот файл, из вашего файла ~/.bashrc.
export PYTHONSTARTUP=~/.pythonrc
Теперь, начиная с будущего, всякий раз, когда вы откроете оболочку bash, у вас будет TAB-дополнение и история введенного кода в вашем интерпретаторе Python.
Чтобы использовать его в текущей оболочке, загрузите файл bashrc.
$ source ~/.bashrc