Python package init script

Пакеты Python — создание и доступ

Пакеты Python помогают нам управлять модулями и скриптами Python. Это обычные каталоги со сценарием инициализации — __init__.py.

Как создать пакет Python?

Мы можем создать пакет, выполнив следующие шаги.

  1. Создайте каталог пакета – для этого мы можем использовать terminal или Python IDE.
  2. Создать __init__.py файл — это необходимо для преобразования обычного каталога в пакет python. Этот файл используется для инициализации пакета и перечисления всех модулей. В самом простом виде этот файл может быть пустым.

Что мы можем сохранить в пакете?

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

Можно ли создавать подпакеты?

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

Примеры

Давайте рассмотрим несколько примеров создания и использования пакетов.

1. Создание пакета

$ mkdir utilities $ touch utilities/__init__.py $ mkdir utilities/strings $ mkdir utilities/strings/__init__.py $ tree . └── utilities ├── __init__.py └── strings └── __init__.py 3 directories, 1 file $

Python пакеты

2. Добавление модулей

Допустим, у нас есть два модуля Python — math.py и str_utils.py. У них есть несколько функций, которые будут использоваться в нашей программе.

def add(x, y): return x + y def multiply(x, y): return x * y
def to_uppercase(s): s = str(s) return s.upper() def reverse(s): s = str(s) return s[::-1]

Мы хотим добавить эти модули в наши пакеты. Просто скопируйте эти файлы в каталог пакетов, где вы хотите сохранить эти модули.

$ ls math.py str_utils.py utilities $ mv math.py utilities $ mv str_utils.py utilities/strings $ tree . └── utilities ├── __init__.py ├── math.py └── strings ├── __init__.py └── str_utils.py 3 directories, 3 files $

добавление модуля в пакет

3. Импорт пакета

Синтаксис для импорта модуля Python внутри пакета:

import package.sub_package1.sub_package2.module import package.sub_package1.sub_package2.module as module

Python использует переменную sys.path для поиска пакетов и модулей. Текущий каталог является частью переменной sys.path . Поэтому мы будем хранить наш скрипт python в каталоге python-packages. В противном случае нам придется добавить местоположение пакета в переменную sys.path .

$ cat my_script.py import sys print(sys.path) $ python3.7 my_script.py ['/Users/pankaj/Desktop/python-packages', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python37.zip', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib-dynload', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages'] $

Вот код my_script.py для доступа к модулям из пакетов и вызова их функций.

import utilities.math as math import utilities.strings.str_utils as str_utils print(math.add(10, 20)) print(str_utils.reverse("ABC"))

Модуль Импорта

Мы также можем импортировать модуль, используя синтаксис ниже:

from package.sub_package1.sub_package2 import module

Вот обновленный пример доступа к модулям «math» и «str_utils» в нашей программе.

from utilities import math from utilities.strings import str_utils print(math.add(10, 20)) print(str_utils.reverse("ABC"))

Из Модуля Импорта Пакетов

4. Импорт * из пакета

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

from package.sub_package1.sub_package2 import *

В этом случае Python ищет в sub_package2 пакеты, модули и функции. Это может вызвать побочные эффекты из-за импорта того, чего вы не хотите. Кроме того, это очень долгий процесс.

Мы можем определить список импортируемых модулей, создав переменную __all__ в файле __init__.py.

print('utilities package initialized') __all__ = ['math']

утилиты / строки / __ init__.py:

print('utilities.strings package initialized') __all__ = ['str_utils']

Обновленный код my_script.py:

from utilities import * from utilities.strings import * print(math.add(10, 20)) print(str_utils.reverse("ABC"))
$ python3.7 my_script.py utilities package initialized utilities.strings package initialized 30 CBA

Файл Инициализации Всех Модулей

Обратите внимание, что код python в __init__.py выполняется первым, когда пакеты инициализируются и импортируются.

Как добавить пакет в системный путь

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

import sys sys.path.append("/Users/pankaj/Desktop/python-packages") print(sys.path) import utilities.math as math print(math.add(1, 2))
$ python3.7 my_script.py ['/Users/pankaj', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python37.zip', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/lib-dynload', '/Library/Frameworks/Python.framework/Versions/3.7/lib/python3.7/site-packages', '/Users/pankaj/Desktop/python-packages'] utilities package initialized 3 $

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

Источник

Package Initialization

Chris Bailey

In this lesson, you’ll learn about package initialization. If a file named __init__.py is present in a package directory, it is invoked when the package or a module in the package is imported. You can use this to execute package initialization code, for example for the initialization of package-level data.

Consider the following __init__.py file:

print(f'Invoking __init__.py for __name__>') alist = ['spam', 'bacon', 'eggs'] 

Add this file to the pkg directory from the above example:

Illustration of hierarchical file structure of Python packages

Now, when the package is imported, the global list alist is initialized:

>>> import pkg Invoking __init__.py for pkg >>> pkg.alist ['spam', 'bacon', 'eggs'] >>> pkg.mod1 Traceback (most recent call last): File "", line 1, in pkg.mod1 AttributeError: module 'pkg' has no attribute 'mod1' 

A module in the package can access the global by importing it in turn:

def load_data(): print('loading data using mod1.load_data()') from pkg import alist print(f'This is from pkg - alist>') class Customer: pass 
>>> from pkg import mod1 Invoking __init__.py for pkg >>> mod1.load_data() loading data using mod1.load_data() This is from pkg - ['spam', 'bacon', 'eggs'] 

Revert mod1.py to the previous version by changing load_data() to no longer use the import from pkg :

def load_data(): print('loading data using mod1.load_data()') class Customer: pass 

You can also use __init__.py to effect automatic importing of modules from a package. For example, earlier you saw that the statement import pkg only places the name pkg in the caller’s local symbol table and doesn’t import any modules. Let’s say that __init__.py in the pkg directory contains the following:

print(f'Invoking __init__.py for __name__>') import pkg.mod1, pkg.mod2 

Then, when you execute import pkg , modules mod1 and mod2 would be imported automatically:

>>> import pkg Invoking __init__.py for pkg >>> pkg.mod1.load_data() loading data using mod1.load_data() >>> x = pkg.mod2.Location() >>> x 

Note: Much of the Python documentation states that an __init__.py file must be present in the package directory when creating a package. This was once true. It used to be that the very presence of __init__.py signified to Python that a package was being defined. The file could contain initialization code or even be empty, but it had to be present.

Starting with Python 3.3, Implicit Namespace Packages were introduced. These allow for the creation of a package without any __init__.py file. Of course, it can still be present if package initialization is needed. But it is no longer required.

Источник

Читайте также:  Массовое переименование файлов python
Оцените статью