Где находятся библиотеки python
Перейти к содержимому

Где находятся библиотеки python

  • автор:

Где хранятся модули в Python?

Python_Deep_6.11-5020-3e1392.png

Система модулей даёт возможность логически организовать код на Python. Кроме того, группирование в модули значительно облегчает сам процесс написания кода, плюс делает его более понятным. В этой статье поговорим, что такое модуль в Python, где он хранится и как обрабатывается.

Модуль в Python — это файл, в котором содержится код на Python. Любой модуль в Python может включать в себя переменные, объявления функций и классов. Вдобавок ко всемe, в модуле может содержаться исполняемый код.

Команда import в Python

Позволяет использовать любой файл Python в качестве модуля в другом файле. Синтаксис прост:

 
import module_1[, module_2[. module_N]

Как только Python-интерпретатор встречает команду import, он выполняет импорт модуля, если он есть в пути поиска Python. Что касается пути поиска Python, то речь идёт о списке директорий, в которых интерпретатор выполняет поиск перед загрузкой модуля. Посмотрите на пример кода при использовании модуля math:

 
import math # Используем функцию sqrt из модуля math print (math.sqrt(9)) # Печатаем значение переменной pi, определенной в math print (math.pi)

Помните, что модуль загружается только один раз, вне зависимости от того, какое количество раз вы его импортировали. Таким образом исключается цикличное выполнение содержимого модуля.

Команда from . import

Команда from . import даёт возможность выполнить импорт не всего модуля целиком, а лишь конкретного его содержимого:

 
# Импортируем из модуля math функцию sqrt from math import sqrt # Выводим результат выполнения функции sqrt. # Нам больше незачем указывать имя модуля print (sqrt(144)) # Но мы уже не можем получить из модуля то, что не импортировали print (pi) # Выдаст ошибку

Обратите внимание, что выражение from . import не импортирует модуль полностью, а лишь предоставляет доступ к объектам, указанным нами.

Команда from . import *

Также в Python мы можем импортировать из модуля переменные, классы и функции за один раз. Чтобы это выполнить, применяется конструкция from . import *:

 
from math import * # Теперь у нас есть доступ ко всем функция и переменным, определенным в модуле math print (sqrt(121)) print (pi) print (e)

Использовать данную конструкцию нужно осторожно, ведь при импорте нескольких модулей можно запутаться в собственном коде.

Так где хранятся модули в Python?

При импорте модуля, интерпретатор Python пытается найти модуль в следующих местах: 1. Директория, где находится файл, в котором вызывается команда импорта. 2. Директория, определённая в консольной переменной PYTHONPATH (если модуль не найден с первого раза). 3. Путь, заданный по умолчанию (если модуль не найден в предыдущих двух случаях).

Что касается пути поиска, то он сохраняется в переменной path в системном модуле sys. А переменная sys.path включает в себя все 3 вышеописанных места поиска.

2-20219-5cca3e.png

Получаем список всех модулей Python

Чтобы получить полный список модулей, установленных на ПК, используют команду help("modules") .

3-20219-a2b765.png

Создаём свой модуль в Python

Для создания собственного модуля в Python нужно сохранить ваш скрипт с расширением .py. После этого он станет доступным в любом другом файле. Давайте создадим 2 файла: module_1.py и module_2.py, а потом сохраним их в одной директории. В первом файле запишем:

 
def hello(): print ("Hello from module_1")

А во втором вызовем функцию:

 
from module_1 import hello hello()

После выполнения кода 2-го файла получим:

 
Hello from module_1

Функция dir() в Python

Возвратит отсортированный список строк с содержанием всех имён, определенных в модуле.

 
# на данный момент нам доступны лишь встроенные функции dir() # импортируем модуль math import math # теперь модуль math в списке доступных имен dir() # получим имена, определенные в модуле math dir(math)

4-20219-710929.png

Пакеты модулей в Python

Несколько файлов-модулей с кодом можно объединить в пакеты модулей. Пакет модулей — это директория, включающая в себя несколько отдельных файлов-скриптов.

Представьте, что у нас следующая структура:

 
|_ my_file.py |_ my_package |_ __init__.py |_ inside_file.py

В файле inside_file.py определена некоторая функция foo. В итоге, дабы получить доступ к этой функции, в файле my_file нужно выполнить:

 
from my_package.inside_file import foo

Также нужно обратить внимание на то, есть ли внутри директории my_package файл init.py. Это может быть и пустой файл, сообщающий Python, что директория является пакетом модулей. В Python 3 включать файл init.py в пакет модулей уже не обязательно, но мы рекомендуем всё же делать это, чтобы обеспечить обратную совместимость.

Стандартная библиотека¶

Стандартная библиотека Python содержит огромное количество полезных модулей и является частью стандартного комплекта поставки Python. Ознакомиться со стандартной библиотекой Python очень важно, так как множество задач можно решить очень быстро, если вы знакомы с возможностями этих библиотек.

Рассмотрим некоторые наиболее часто используемые модули этой библиотеки. Детальное описание всех модулей стандартной библиотеки Python можно найти в разделе "Library Reference" документации, входящей в комплект поставки Python.

Давайте изучим несколько полезных модулей.

Если темы в настоящей главе покажутся вам слишком сложными, вы можете её пропустить. Однако я настоятельно рекомендую вернуться к этой главе, когда вы будете чувствовать себя более уверенно с Python.

Модуль sys¶

Модуль sys содержит функциональность, характерную для системы. Так мы видели, что список sys.argv содержит аргументы командной строки.

Предположим, нам нужно узнать версию используемой команды Python с тем, чтобы, к примеру, убедиться в том, что мы используем как минимум версию 3. Модуль sys предоставляет такую возможность.

1 2 3 4 5
>>> import sys >>> sys.version_info (3, 0, 0, 'beta', 2) >>> sys.version_info[0] >= 3 True 

Как это работает:

Модуль sys содержит кортеж version_info , который хранит информацию о версии. Первый элемент этого кортежа обозначает старшую версию. Мы можем использовать его, например, для того, чтобы убедиться, что программа будет выполняться только в Python 3.0:

Сохраните как versioncheck.py :

1 2 3 4 5 6 7
import sys, warnings if sys.version_info[0]  3: warnings.warn("Для выполнения этой программы необходима как минимум \ версия Python 3.0", RuntimeWarning) else: print('Нормальное продолжение') 

Вывод:

1 2 3 4 5 6
$ python2.7 versioncheck.py versioncheck.py:6: Для выполнения этой программы необходима как минимум версия Python 3.0 RuntimeWarning) $ python3 versioncheck.py Нормальное продолжение 

Как это работает:

Мы используем один из модулей стандартной библиотеки, который называется warnings и служит для отображения предупреждений пользователю. Если версия Python менее 3, мы показываем соответствующее предупреждение.

Модуль logging¶

Представьте ситуацию, когда необходимо сохранить некоторые отладочные или другие важные сообщения где-нибудь, чтобы иметь возможность позже проверить, отработала ли программа, как ожидалось. Как мы "сохраним где-нибудь" эти сообщения? Сделать это можно при помощи модуля logging .

Сохраните как use_logging.py :

 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
import os, platform, logging if platform.platform().startswith('Windows'): logging_file = os.path.join(os.getenv('HOMEDRIVE'), os.getenv('HOMEPATH'), 'test.log') else: logging_file = os.path.join(os.getenv('HOME'), 'test.log') print("Сохраняем лог в", logging_file) logging.basicConfig( level=logging.DEBUG, format='%(asctime)s : %(levelname)s : %(message)s', filename = logging_file, filemode = 'w', ) logging.debug("Начало программы") logging.info("Какие-то действия") logging.warning("Программа умирает") 

Вывод:

$ python3 use_logging.py Сохраняем лог в C:\Users\swaroop\test.log 

Если открыть файл test.log , он будет выглядеть примерно так:

1 2 3
2012-10-26 16:52:41,457 : DEBUG : Начало программы 2012-10-26 16:52:41,474 : INFO : Какие-то действия 2012-10-26 16:52:41,475 : WARNING : Программа умирает 

Как это работает:

Мы использовали три модуля из стандартной библиотеки: модуль os для взаимодействия с операционной системой, модуль platform для получения информации о платформе (т.е. операционной системе) и модуль logging для сохранения лога 1 .

Прежде всего, при помощи строки, возвращаемой функцией platform.platform() мы проверяем, какая операционная система используется (для более подробной информации см. import platform; help(platform) ). Если это Windows, то мы определяем диск, содержащий домашний каталог, путь к домашнему каталогу на нём и имя файла, в котором хотим сохранить информацию. Сложив все эти три части, мы получаем полный путь к файлу. Для других платформ нам нужно знать только путь к домашнему каталогу пользователя, и мы получим полный путь к файлу.

При помощи функции os.path.join() мы объединяем три части пути к файлу вместе. Мы используем эту функцию вместо простого объединения строк для того, чтобы гарантировать, что полный путь к файлу записан в формате, ожидаемом операционной системой.

Далее мы конфигурируем модуль logging таким образом, чтобы он записывал все сообщения в определённом формате в указанный файл.

Наконец, мы можем выводить сообщения, предназначенные для отладки, информирования, предупреждения и даже критические сообщения. После выполнения программы можно просмотреть этот файл и узнать, что происходило в программе, хотя пользователю, запустившему программу, ничего не было показано.

Модули urllib и json¶

 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35
#!/usr/bin/python # Filename: yahoo_search.py import sys if sys.version_info[0] != 3: sys.exit('This program needs Python 3.0') import json import urllib, urllib.parse, urllib.request, urllib.response # Get your own APP ID at http://developer.yahoo.com/wsregapp/ YAHOO_APP_ID = 'jl22psvV34HELWhdfUJbfDQzlJ2B57KFS_qs4I8D0Wz5U5_yCI1Awv8.lBSfPhwr' SEARCH_BASE = 'http://search.yahooapis.com/WebSearchService/V1/webSearch' class YahooSearchError(Exception): pass # Taken from http://developer.yahoo.com/python/python-json.html def search(query, results=20, start=1, **kwargs): kwargs.update( 'appid': YAHOO_APP_ID, 'query': query, 'results': results, 'start': start, 'output': 'json' >) url = SEARCH_BASE + '?' + urllib.parse.urlencode(kwargs) result = json.load(urllib.request.urlopen(url)) if 'Error' in result: raise YahooSearchError(result['Error']) return result['ResultSet'] query = input('What do you want to search for? ') for result in search(query)['Result']: print("  : ".format(result['Title'], result['Url'])) 

Резюме¶

Мы изучили лишь некоторые возможности некоторых модулей стандартной библиотеки Python. Я настоятельно рекомендую просмотреть документацию по стандартной библиотеке Python, чтобы увидеть все доступные модули.

Далее мы обратимся к некоторым аспектам, которые сделают вашу экскурсию по Python более "завершённой".

  1. log — англ. "журнал", "вести журнал" (прим.перев.) ↩

Пути поиска модулей#

При импорте модуля, Python сначала ищет модуль в стандартной библиотеке. Если модуль не найден в стандартной библиотеке, поиск модуля идет в каталогах, которые указаны в sys.path.

Содержимое sys.path состоит из:

  • текущего каталога
  • каталогов, которые указаны в переменной PYTHONPATH
  • пути по умолчанию (зависят от установки Python)

Пути поиска модулей хранятся в переменной sys.path:

In [1]: import sys In [2]: sys.path Out[2]: ['', '/usr/local/bin', '/usr/local/lib/python36.zip', '/usr/local/lib/python3.6', '/usr/local/lib/python3.6/lib-dynload', '/home/vagrant/.local/lib/python3.6/site-packages', '/usr/local/lib/python3.6/site-packages', '/usr/local/lib/python3.6/site-packages/IPython/extensions', '/home/vagrant/.ipython'] 

Аналогичный вывод, но внутри виртуального окружения:

In [1]: import sys In [2]: sys.path Out[2]: ['/home/vagrant/venv/pyneng-py3-8-0/bin', '/home/vagrant/venv/pyneng-py3-8-0/lib/python38.zip', '/home/vagrant/venv/pyneng-py3-8-0/lib/python3.8', '/home/vagrant/venv/pyneng-py3-8-0/lib/python3.8/lib-dynload', '/usr/local/lib/python3.8', '', '/home/vagrant/venv/pyneng-py3-8-0/lib/python3.8/site-packages', '/home/vagrant/venv/pyneng-py3-8-0/lib/python3.8/site-packages/IPython/extensions', '/home/vagrant/.ipython'] 

Добавление своих скриптов в пути поиска модулей#

Добавить свой скрипт в пути поиска модулей нужно в том случае, если этот скрипт нужно использовать в других скриптах, которые находятся в разных каталогах.

Для добавления модулей в пути поиска есть несколько вариантов:

  1. Переместить скрипт в каталог site-packages
  2. Создать специальный файл с расширением pth в каталоге site-packages и написать в этом файлы пути поиска модулей

Конкретный путь каталога site-packages зависит от версии Python и того используете ли вы виртуальное окружение. Например, в последнем выводе sys.path путь будет '/home/vagrant/venv/pyneng-py3-8-0/lib/python3.8/site-packages' . Если переместить туда скрипт, его можно будет импортировать из любого другого скрипта.

Так как переносить файлы не всегда удобно, есть второй вариант - файлы pth. Для этого варианта надо создать файл с любым именем в каталоге site-packages, например, my_scripts.pth и написать в нем пути к нужным скриптам:

/home/vagrant/repos/pyneng/examples/11_modules /home/vagrant/repos/pyneng/exercises/09_functions /home/vagrant/repos/pyneng/exercises/11_modules /home/vagrant/repos/pyneng/exercises/12_userful_modules 

Обратите внимание, что тут речь именно об использовании функций какого-то вашего скрипта в других скриптах, не о запуске модуля из любого места в файловой системе как утилиты. Это тоже можно сделать, коротко о том как установить скрипт с CLI интерфейсом как утилиту в ОС. Например, так устанавливалась утилита pyneng.

Где находятся бинарники библиотек Python под Windows

null

Когда возникали проблемы с установками тех или иных геопространственных библиотек Python на Windows, приходилось скачивать бинарники с сайта Christoph Gohlke — Unofficial Windows Binaries for Python Extension Packages. Все форумы и гайды всегда ссылались на этот сайт, где были представлены 32- и 64-битные бинарные файлы многих пакетов с открытым исходным кодом для официального дистрибутива CPython. Несколько бинарников были доступны и для дистрибутива PyPy.

Сайт вел один человек, и сборки всех библиотек и поддержка сайта осуществлялись на базе одной из лабораторий Калифорнийского университета. 7 июня 2022 года на сайте появилась новость, что финансирование этой лаборатории заканчивается, и до конца месяца сайт перестанет работать. 26 июня вышло последнее обновление и последние сборки библиотек. После этого на сайт еще можно было зайти и скачать старые версии библиотек, но наблюдались сбои с работой сайта.

Вместо этого 5 января на гитхабе того же Christoph Gohlke появились репозитории, которые возродили этот сервис по публикации бинарников питоновских библиотек под Windows. Теперь его репозиторий GitHub предоставляет неофициальные бинарные архивы wheel для некоторых геопространственных библиотек для Python под Windows. Все можно скачать со страницы Releases.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *