Python package
last modified January 29, 2024
In this article we cover Python packages.
A Python package is a collection of modules which have a common purpose.
Package directories must have one special file called __init__.py
.
(Since Python 3.3, __init__.py
is no longer required to define
package directories.) A Python module is a single Python file.
When we deal with large projects containing hundreds or thousands of modules, using packages is crucial. For example, we could put all database related modules in a database package and user interface code in ui package.
Built-in packages available in predefined directories; for instance,
/usr/lib/python3.5
on Debian Linux or
C:\Users\Jano\AppData\Local\Programs\Python\Python36-32\Lib\site-packages
.
Third-party packages are installed into predefined directories such as
/usr/local/lib/python3.5/dist-packages
on Debian Linux or
C:\Users\Jano\AppData\Local\Programs\Python\Python36-32\libs
on Windows.
Python package management
Python packages are managed with the Python package manager pip
.
$ sudo pip3 install arrow
For instance, the arrow library is installed with the above command.
$ sudo pip3 uninstall arrow
To uninstall arrow, we use the above command.
Python package with empty __init__.py
In the first example, we create a simple package in Python.
$ tree . ├── mymath │ ├── __init__.py │ └── mfuns.py └── myprog.py
In our current working directory we have a mymath
directory
and a myprog.py
script. The mymath
contains
the __init__.py
file, which marks the mymath
directory
as a package directory.
The mymath
directory has two files: the __init__.py
file makes
constants a Python package directory and the mfuns.py
is a Python module.
The __init__.py
is blank. It can contain some code but it can be
also empty.
def mycube(x): return x * x * x
In the mfuns.py
module, we have a definition of a cube
function.
#!/usr/bin/python # myprog.py from mymath.mfuns import mycube print(mycube(3))
In the myprog.py
program, we import the mycube
function from th mymath.mfuns
module. The module name and the
package name is separated with a dot character.
Python importing function in __init__.py
In the next example, we have some code in the __init__.py
file.
$ tree . ├── mymath │ ├── __init__.py │ └── mfuns.py └── myprog.py
We have the same directory structure.
from .mfuns import mycube
In the __init__.py
file, we import the mycube
function.
As a consequence, we do not have to specify the module name when we refer to
the mycube
function from the mymath
package.
def mycube(x): return x * x * x
In the mfuns.py
module, we have a definition of a cube
function.
#!/usr/bin/python # myprog.py from mymath import mycube print(mycube(3))
In the myprog.py
program, we import the mycube
function.
This time we have omitted the module name.
Python package without __init__.py
Since Python 3.3 it is possible to define package directories without using
the __init__.py
file.
read.py constants/ data.py
In our current working directory we have a constants
directory
and a read.py
script.
colours = ('yellow', 'blue', 'red', 'orange', 'brown') names = ('Jack', 'Jessica', 'Robert', 'Lucy', 'Tom')
The data.py
module has two tuples.
#!/usr/bin/python # read.py from constants.data import colours import constants.data as mydata print(colours) print(mydata.names)
In the read.py
script we import the tuples and print
them to the terminal.
$ ./read.py ('yellow', 'blue', 'red', 'orange', 'brown') ('Jack', 'Jessica', 'Robert', 'Lucy', 'Tom')
Python arrow package
The arrow is a third-party library for working with date and time in Python.
$ ls /usr/local/lib/python3.5/dist-packages/arrow api.py arrow.py factory.py formatter.py __init__.py locales.py parser.py __pycache__ util.py
The library is installed in the arrow directory, under the dist-packages
in Debian Linux. The library is installed with the pip
package manager.
As we can see, the library is a collection of Python modules.
Python subpackages
We can also create subpackages. To access subpackages, we use the dot operator.
$ tree . ├── constants │ ├── __init__.py │ ├── data.py │ └── numbers │ ├── __init__.py │ └── myintegers.py └── read.py
from .data import names
This is the __init__.py
file in the
constants
directory. We import the names
tuple.
names = ('Jack', 'Jessica', 'Robert', 'Lucy', 'Tom')
This is the data.py
module in the
constants
directory. It contains the names
tuple.
from .myintegers import myintegers
The __init__.py
file in the numbers package has
this one line.
myintegers = (2, 3, 45, 6, 7, 8, 9)
The integers module defines a tuple of seven integers. This tuple will
be accessed from the read.py
script.
#!/usr/bin/python # read.py from constants import names from constants.numbers import myintegers print(names) print(myintegers)
This is the read.py
program. We import the names
tuple from the constants
package and the myintegers
tuple from the constants.numbers
subpackage.
$ ./read.py ('Jack', 'Jessica', 'Robert', 'Lucy', 'Tom') (2, 3, 45, 6, 7, 8, 9)
Source
Python packages - language reference
In this article we have covered Python packages.
Author
List all Python tutorials.