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

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

Модули в Python

Модули – это организационная единица самого высокого уровня в Python. Если вы хотя бы немного знакомы с Python, вероятно уже использовали готовые модули или создали свои. Что же такое модуль? Модули – это программные единицы, хранящие код и данные, обеспечивающие повторное использование кода для Python проектов и также полезны при разбиении пространств имён в автономных пакетах. Они автономны, потому что получить доступ к атрибутам модуля только после их импорта. Их также можно рассматривать, как пакеты имён, которые при импорте становятся атрибутами импортированного модуля. Фактически, любой файл Python с расширением *.py является модулем.

Создание модуля

Для создания модуля в Python достаточно определить файл с суффиксом .py. Хотя не каждый файл Python предназначен для импорта в качестве модуля. Файлы Python, которые используются для работы в качестве автономного приложения Python (файлы верхнего уровня), обычно предназначены для запуска в виде скриптов, а импорт их, фактически запускает команды внутри скрипта.

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

Хотя правила создания модулей довольно условные, существует одно правило для именования модулей. Поскольку имена файлов модулей становятся именами переменных в Python при импорте не разрешается называть модули зарезервированными словами Python. Например, модуль for.py может быть создан, но не может быть импортирован, поскольку «for» – зарезервированное слово. Проиллюстрируем всё вышесказанной примером с «Hello world!».

My_module.py представлен как модуль, код которого может быть импортирован и повторно использован в других файлах Python. Он не требует какого-либо дополнительных действий, просто определяет функции и переменные. «my_script.py» разработан как скрипт верхнего уровня, который явно вызывает функцию hello_printer и печатает значение переменной.

Запустим файл my_script.py в терминале:

Как отмечалось ранее, важный вывод из этого первого базового примера – это то, что важны имена файлов модулей. После импорта они становятся переменными/объектами в модуле импортера. Все определения верхнего уровня в модуле становятся атрибутами этой переменной.

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

Архитектура программы

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

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

На этом рисунке модуль top_module.py – это файл Python верхнего уровня, который импортирует функции, определенные в модуле module1, но также имеет доступ к функциям в module2 через module1. Два пользовательских модуля используют ресурсы друг друга, а также другие модули из стандартной библиотеки Python. Цепочка импорта может идти настолько глубоко, насколько нужно – нет ограничений в количестве импортированных файлов, и они могут импортировать друг друга, хотя нужно быть осторожным с циклическими импортами.

В приведенном выше примере top_module.py – это модуль верхнего уровня, который будет запускаться пользователем, и он импортирует инструменты из других модулей через module1.py. module1 и module2 являются определяемыми пользователем модулями, а модуль math импортируется из стандартной библиотеки. При запуске скрипта верхнего уровня получаем:

$ python top_module.py k = 2 n = 5
10.0

Когда запускается файл Python верхнего уровня, его операторы исходного кода и операторы в импортированных модулях компилируются в промежуточный формат, известный как байт код, который является независимым от платформы. Файлы байт кода импортированных модулей хранятся с расширением .pyc в том же каталоге, что и .py-файл для версий Python до 3.2, и в каталоге pycache/ в текущем каталоге программы в Python 3.2+.

Двухрежимный код

Как упоминалось ранее, файлы Python также могут быть разработаны как импортируемые модули, так и сценарии верхнего уровня. То есть при запуске модуль Python запускается как автономная программа, а при импорте он будет работать как импортируемый модуль.

Это легко сделать, используя атрибут name, который автоматически встроен в каждый модуль. Если модуль запущен как скрипт верхнего уровня, атрибут name будет равен строке «main», иначе, если импортирован, он будет содержать имя фактического модуля.

Пример двухрежимного кода:

Если файл запускается как отдельная программа, то такая же функция вызывается автоматически. Разница здесь, по сравнению с примером my_script.py в разделе main, заключается в том, что когда hiprinter.py импортируется, он не будет запускать код, вложенный в оператор if name == ‘main‘.

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

Оператор import

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

Использование инструкции from разрешено только в файле верхнего уровня модуля в Python 3.x, а не внутри функции. Python 2.x позволяет использовать его в функции, но выдает предупреждение. Оператор from медленнее import, поскольку он выполняет всю работу, которую выполняет import через весь контент импортированного модуля, а затем выполняет дополнительные действия при выборе соответствующих имён для импорта.

Существует также третий оператор импорта *, который используется для импорта всех имен в верхний уровень из импортированного модуля и использования их непосредственно в классе импортера. Например:

Код импортирует все имена (переменные и функции) из файла module2.py. Этот подход не рекомендуется из-за возможного дублирования имен, импортированные имена могут перезаписывать уже существующие имена в модуле импортера.

Каталог поиска модуля

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

Python использует внутренний список каталогов, в которых он ищет модули, известные как путь поиска. Путь поиска состоит из каталогов, построенных в следующем порядке:

  1. Домашняя директория программы. Расположение сценария верхнего уровня. Обратите внимание, что домашний каталог может не совпадать с текущим рабочим каталогом.
  2. Каталоги, перечисленные в переменной окружения PYTHONPATH.
  3. Стандартные библиотечные каталоги. Каталоги автоматически устанавливаются с установкой Python и в них всегда выполняются поиск.
  4. Каталоги, перечисленные в .pth файлах. Этот вариант является альтернативой PYTHONPATH, и он добавляет ваши каталоги, указанные по одному в строке, в текстовый файл с суффиксом .pth, который должен быть помещен в каталог установки Python, который обычно является /usr/local/lib/python3.6/ в Unix или C:\Python36\ в Windows.
  5. Каталог site-packages. В этом каталоге автоматически располагаются все сторонние расширения.

PYTHONPATH, вероятно, является наиболее предпочтительным способом. Вы можете легко проверить, установлена ли переменная на вашем компьютере выполнив в командной строке:

Чтобы создать переменную на компьютере с Windows, вы должны использовать инструкции в «Панель управления -> Система -> Дополнительно», в то время как в MacOS и других Unix-системах проще всего добавить следующую строку в

/. bash_profile, где каталоги конкатенируются символом двоеточия («:»).

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

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

Как показано в следующем примере, пустая строка в начале списка определяет текущий каталог:

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

Перезагрузка модуля

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

Например, импортируем код в my_module.py в интерпретаторе Python, затем изменим файл и снова импортируем.

Чтобы отключить кеширование и включить повторный импорт модулей, Python предоставляет функцию reload. Повторим пример:

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

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

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

При импорте имен модулей фактически загружаются файлы Python, хранящиеся где-то в файловой системе. Как уже упоминалось ранее, импортированные модули должны находиться в каталоге, который указан в пути поиска модуля (sys.path). В Python есть нечто большее, чем «импорт имен» – вы можете импортировать весь каталог, содержащий файлы Python, в виде пакета модулей. Этот импорт известен как импорт пакетов.

Как импортировать пакеты модулей? Давайте создадим каталог с именем mydir, который включает в себя модуль mod0.py и два подкаталога subdir1 и subdir2, содержащий модули mod1.py и mod2.py соответственно. Структура каталогов выглядит так:

Обычный подход, который объяснялся до сих пор, заключался в том, чтобы добавить пути mydir, subdir1 и subdir2 к каталоги поиска модуля (sys.path), чтобы иметь возможность импортировать mod0.py, mod1. py и mod2.py. Это может привести к большим накладным расходами, если модули распределены по множеству разных подкаталогов. В любом случае, импорт пакетов будет предпочтительнее, потому что работают с импортом имени самой папки.

Недопустимая инструкция, приводящая к ошибке InvalidSyntax:

Правильный способ выполнить это – установить каталог /Users/Code/Projects/ в путь поиска модуля (добавив его в переменную среды PYTHONPATH или указав её в файле .pth), а затем импортировать модули, используя точечный синтаксис.

Вы, наверное, уже замечали, что некоторые Python каталоги содержат файл init.py. Это было фактически требование в Python2.x, чтобы сообщить Python, что ваш каталог является пакетым модулем. Файл init.py также является обычным файлом Python, который запускается всякий раз, когда этот каталог импортируется, и подходит для инициализации значений, например, для подключения к базе данных.

В большинстве случаев эти файлы просто пусты. В Python3.x эти файлы являются необязательными, и их можно использовать, если это необходимо. Следующие несколько строк показывают, как имена, определенные в init.py, становятся атрибутами импортируемого объекта (имя каталога, содержащего его).

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

Строка импорта mod2 сообщает Python о поиске модуля mod2 в sys.path, и поэтому он не увенчался успехом. В данном случае нам поможет относительный импорт. Следующий оператор относительного импорта использует двойную точку («..»), которая обозначает родительский элемент текущего пакета (‘mydir /’). Для создания полного относительного пути к модулю mod2 необходимо включить следующий subdir2.

Относительный импорт – это огромная тема, которая может занять целую книгу. Они также сильно отличаются между версиями Python2.x и 3.x. Поддержка Python 2.x заканчивается в 2020 году, поэтому в тех случаях, когда существует большая разница между версиями Python, например, в относительном импорте, лучше сосредоточиться на версии 3.x.

Публикация пакета в PyPi

На текущий момент вы узнали, как писать модули Python, различать импортируемые модули и высокоуровневые, использовать определенные пользователем модули в границах каталога, изменять путь поиска модулей и, кроме всего прочего, создавать/импортировать пакеты модулей. После создания полезного программного обеспечения, упакованного в пакет модулей, вы можете поделиться им с большим сообществом Python. Пакетный индекс Python (PyPi) – это программный репозитарий, в настоящее время содержащий более 120 тыс. пакетов (на момент написания этой статьи). Возможно, вы уже устанавливали модули из репозитория с помощью команды pip.

Например, следующая строка загрузит и устанавливать библиотеку Numpy:

Как опубликовать свой пакет в репозитарии? Во-первых, он должен удовлетворять требованиям к упаковке и распространению. Необходимо выполнить два условия: установить pip, setuptools, wheel и установить twine, который используется для загрузки проекта в PyPi.

Следующим шагом будет настройка вашего проекта. В общем, это означает добавление нескольких файлов Python в проект, которые будут содержать информацию о конфигурации, руководства по использованию и т. д. Далее перечислены самые важные файлы, которые нужно добавить: setup.py. Этот файл необходимо добавить в корень проекта и использовать в качестве интерфейса установки из командной строки. Он должен содержать функцию setup(), которая будет принимать в качестве аргумента информацию, такую как: имя проекта, версия, описание, лицензия, зависимости проекта и т. д. README.rst: текстовый файл, описывающий пакет. licence.txt: текстовый файл, содержащий лицензию на программное обеспечение.

Наиболее востребованным форматом пакета является wheel. Запуск одной из следующих команд приведет к созданию каталога dist/ в корне вашего проекта, который содержит файлы в пакет для загрузки в PyPi.

Последний шаг – загрузка вашего дистрибутива в PyPi. Для этого нудно создать учетную запись на сайте PyPi и загрузить содержимое каталога dist/, созданного на предыдущем шаге.

Для получения дополнительной информации обратитесь к официальному сайту PyPi.

Как написать, упаковать и распространять библиотеку на Python

Gigi Sayfan

Gigi Sayfan Aug 1, 2017

Python — отличный язык программирования, но упаковка — одна из его самых слабых точек. Это общеизвестный в сообществе факт. За последние годы установка, импорт, использование и создание пакетов значительно улучшилась, но она все еще не соответствует новым языкам, таким как Go и Rust, которые многому научились в борьбе с Python и другими зрелыми языками.

В этом уроке вы узнаете все, что вам нужно знать о написании, упаковке и распространении собственных пакетов.

Как написать библиотеку Python

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

Давайте быстро напишем небольшой пакет Python 3 и проиллюстрируем все эти понятия.

Пакет Pathology

Python 3 имеет отличный объект Path, который является большим улучшением по сравнению с неудобным модулем Os.path Python 2. Но ему не хватает одной важной возможности — найти путь к текущему сценарию. Это очень важно, если вы хотите найти файлы доступа относительно текущего скрипта.

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

Вот как вы это делаете в Python:

Чтобы получить доступ к файлу с именем ‘file.txt’ в подкаталоге данных в каталоге текущего скрипта, вы можете использовать следующий код:print(open(str(script_dir/’data/file.txt’).read())

С пакетом pathology у вас есть встроенный метод script_dir, и вы используете его следующим образом:

Да, это глоток свежего воздуха. Пакет патологии очень прост. Он выводит свой собственный класс Path из Pathlib Path и добавляет статический script_dir(), который всегда возвращает путь вызывающего скрипта.

Из-за кросс-платформенной реализации pathlib.Path вы можете получить непосредственно от него и должны быть получены из определенного подкласса (PosixPath или WindowsPath). Разрешение dir-файла сценария использует модуль проверки, чтобы найти вызывающего, а затем его атрибут имени файла.

Тестирование пакета патологии

Всякий раз, когда вы пишете нечто более сложное, вы должны его протестировать. Модуль патологии не является исключением. Вот тесты с использованием стандартной модульной тестовой платформы:

Путь Python

Пакеты Python должны быть установлены где-то на пути поиска Python, который должен быть импортирован модулями Python. Путь поиска Python представляет собой список каталогов и всегда доступен в sys.path . Вот мой текущий sys.path:

Обратите внимание, что первая пустая строка вывода представляет текущий каталог, поэтому вы можете импортировать модули из текущего рабочего каталога, что бы это ни было. Вы можете напрямую добавлять или удалять каталоги в / из sys.path.

Вы также можете определить переменную среды PYTHONPATH, и есть несколько других способов ее контролировать. Стандартные site-packages включены по умолчанию, и именно там устанавливаются пакеты, которые вы устанавливаете с помощью pip.

Как упаковать библиотеку Python

Теперь, когда у нас есть наш код и тесты, давайте упакуем все это в нужную библиотеку. Python обеспечивает простой способ через модуль настройки. Вы создаете файл setup.py в корневом каталоге вашего пакета. Затем, чтобы создать исходный дистрибутив, вы запустите: python setup.py sdist

Чтобы создать двоичный дистрибутив, называемый колесом, вы запускаете: python setup.py bdist_wheel

Вот файл setup.py пакета патологии:

Он включает в себя множество метаданных в дополнение к элементу ‘packages’, который использует функцию find_packages() , импортированную из s e tuptools, чтобы найти подпакеты.

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

Предупреждение связано с тем, что я использовал нестандартный файл README.md. Это безопасно поэтому игнорируем. Результатом является файл tar-gzipped в каталоге dist:

И вот двоичное распределение:

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

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

Как раздавать пакет Python

Python имеет центральный репозиторий пакетов, называемый PyPI (индекс пакетов Python). Когда вы устанавливаете пакет Python с помощью pip, он загружает пакет из PyPI (если вы не укажете другой репозиторий). Чтобы распространять наш пакет патологии, нам нужно загрузить его в PyPI и предоставить некоторые дополнительные метаданные, которые требуется PyPI. Шаги:

  • Создайте учетную запись на PyPI (только один раз).
  • Зарегистрируйте свой пакет.
  • Загрузите свой пакет.

Создайте аккаунт

Вы можете создать учетную запись на веб-сайте PyPI. Затем создайте файл .pypirc в своем домашнем каталоге:

В целях тестирования вы можете добавить «pypitest» индексный сервер в ваш .pypirc файл:

Зарегистрируйте свой пакет

Если это первый выпуск вашего пакета, вам необходимо зарегистрировать его с помощью PyPI. Используйте команду register setup.py. Она попросит вас ввести пароль. Обратите внимание, что я указываю его на тестовый репозиторий:

Загрузите свой пакет

Теперь, когда пакет зарегистрирован, мы можем его загрузить. Я рекомендую использовать twine, который более безопасен. Установите его, как обычно, с помощью pip install twine . Затем загрузите свой пакет с помощью twine и укажите свой пароль (отредактированный ниже):

Для более глубокого погружения в тему распространения ваших пакетов ознакомьтесь с разделом «Пакеты Python».

Заключение

В этом уроке мы прошли полноценный процесс написания библиотеки Python, ее упаковки и распространения через PyPI. На этом этапе у вас должны быть все инструменты для написания и обмена вашими библиотеками с остальным миром.

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

Как посмотреть установленные модули Python и вывести их список

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

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

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

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

Проверка всех установленных модулей Python

В этом разделе мы собираемся использовать следующие два способа, чтобы проверить все установленные модули Python в нашей системе и получить их список:

  1. Проверить все локально установленные модули Python.
  2. Проверить все установленные модули Python.

Метод 1: проверка всех локально установленных модулей Python

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

В оболочке Python (или в записной книжке Jupyter и лаборатории Jupyter) мы должны написать следующую команду внутри оболочки:

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

Проверка локально установленных модулей в Python

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

Локально установленные модули

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

Метод 2: проверка всех установленных модулей Python

Чтобы проверить все установленные модули Python, мы можем использовать следующие две команды с ‘pip’:

  1. Использование команды ‘pip freeze’.
  2. Использование команды pip list.

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

  • Использование команды pip freeze: мы должны использовать эту команду внутри терминала командной строки нашего устройства. Сначала мы должны открыть терминал командной строки, а затем мы должны написать в нем команду pip, а после этого мы должны нажать клавишу ввода. Когда мы нажимаем клавишу ввода, установщик pip начнет собирать список всех установленных модулей Python, и через некоторое время он покажет нам список, как показано ниже:

Использование команды pip freeze

  • Использование команды pip list: если в нашей системе установлен установщик pip версии 1.3 или более поздней, то мы также можем использовать этот метод для получения списка всех установленных модулей Python. Как и в предыдущем методе, нам просто нужно написать команду pip list в терминале командной строки нашего устройства и нажать клавишу ввода.

Когда мы нажимаем клавишу ввода, установщик pip начнет собирать список всех установленных модулей Python, и через некоторое время он покажет нам список, как показано ниже:

Использование команды pip list

Здесь мы изменили команду ‘pip list’ на ‘pip list– format = column’, чтобы мы могли получить список всех установленных модулей Python в нашей системе в форматах столбцов.

Вывод

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

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

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

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