Article image Creating a Python Package for Distribution

44. Creating a Python Package for Distribution

Page 94 | Listen in audio

44. Creating a Python Package for Distribution

Python is an incredibly versatile programming language, and one of its strengths lies in its vast ecosystem of packages. These packages allow developers to share and reuse code efficiently. In this section, we will delve into the process of creating a Python package for distribution, enabling you to share your code with the world, whether through a private repository or the Python Package Index (PyPI).

Understanding Python Packages

A Python package is essentially a collection of modules, which are files containing Python code. By organizing related modules into packages, you can maintain a clean and logical structure for your code. This is particularly beneficial when dealing with large projects or when you intend to distribute your code to others.

To create a package, you need to follow a specific directory structure and include certain files that provide metadata about the package. This metadata is crucial as it informs users and tools about the package's contents, dependencies, and other relevant information.

Basic Package Structure

The basic structure of a Python package looks like this:


mypackage/
    ├── mypackage/
    │   ├── __init__.py
    │   ├── module1.py
    │   └── module2.py
    ├── setup.py
    ├── LICENSE
    ├── README.md
    └── tests/
        ├── __init__.py
        └── test_module1.py

  • mypackage/: The root directory of your package.
  • mypackage/__init__.py: This file makes the directory a package. It can be empty or execute package initialization code.
  • setup.py: A script for configuring your package. It includes metadata like the package name, version, author, and more.
  • LICENSE: A file specifying the license under which the package is distributed.
  • README.md: A markdown file providing an overview of the package, installation instructions, and usage examples.
  • tests/: A directory for test cases to ensure your package works as expected.

Creating the setup.py File

The setup.py file is the heart of your package. It uses the setuptools library to define the package's attributes. Here's a basic example:


from setuptools import setup, find_packages

setup(
    name='mypackage',
    version='0.1.0',
    author='Your Name',
    author_email='[email protected]',
    description='A brief description of your package',
    long_description=open('README.md').read(),
    long_description_content_type='text/markdown',
    url='https://github.com/yourusername/mypackage',
    packages=find_packages(),
    classifiers=[
        'Programming Language :: Python :: 3',
        'License :: OSI Approved :: MIT License',
        'Operating System :: OS Independent',
    ],
    python_requires='>=3.6',
    install_requires=[
        # List your package dependencies here
    ],
)

Key components of setup.py include:

  • name: The name of the package. It should be unique if you plan to upload it to PyPI.
  • version: The current version of your package, following semantic versioning.
  • author: Your name or the name of the package's author.
  • author_email: A contact email address.
  • description: A short summary of what your package does.
  • long_description: A detailed description, usually the content of your README file.
  • url: The URL of the package's homepage or repository.
  • packages: A list of all Python import packages that should be included in the distribution package.
  • classifiers: A list of classifiers that describe the package's intended audience, environment, and other metadata.
  • python_requires: Specifies the Python versions compatible with the package.
  • install_requires: A list of dependencies that are required for your package to work.

Writing the __init__.py File

The __init__.py file can be empty, but it often contains initialization code for the package. It can also define what is available to users when they import the package. For example:


from .module1 import some_function
from .module2 import AnotherClass

__all__ = ['some_function', 'AnotherClass']

Here, we are importing specific functions or classes from our modules and defining an __all__ list to control what is exposed when the package is imported using from mypackage import *.

Testing Your Package

Before distributing your package, it is crucial to test it thoroughly. The tests/ directory is where you should write your test cases. You can use testing frameworks like unittest or pytest to automate your testing process.

Here's a simple example using unittest:


import unittest
from mypackage.module1 import some_function

class TestSomeFunction(unittest.TestCase):
    def test_case_1(self):
        self.assertEqual(some_function(2, 3), 5)

if __name__ == '__main__':
    unittest.main()

Building and Distributing Your Package

Once your package is ready and thoroughly tested, the next step is to build and distribute it. This involves creating distribution archives that can be uploaded to PyPI or shared privately.

First, ensure you have the latest versions of setuptools and wheel:


pip install --upgrade setuptools wheel

Then, build your package:


python setup.py sdist bdist_wheel

This command will create two types of distribution archives in the dist/ directory: a source distribution (.tar.gz) and a built distribution (.whl).

Uploading to PyPI

If you want to share your package with the broader Python community, you can upload it to PyPI. You'll need to create an account on PyPI and install twine:


pip install twine

Upload your package using twine:


twine upload dist/*

You'll be prompted to enter your PyPI credentials. Once uploaded, your package will be available for installation via pip.

Conclusion

Creating a Python package for distribution is a rewarding process that allows you to contribute to the Python community and share your work with others. By following the steps outlined in this guide, you can ensure your package is well-structured, tested, and ready for distribution. Remember to keep your package updated and maintain good documentation to enhance its usability and longevity.

With your new skills in package creation, you can automate everyday tasks and help others do the same by sharing your solutions. Happy coding!

Now answer the exercise about the content:

What is the purpose of the `setup.py` file in a Python package?

You are right! Congratulations, now go to the next page

You missed! Try again.

Article image Using Docker for Python Automation

Next page of the Free Ebook:

95Using Docker for Python Automation

8 minutes

Earn your Certificate for this Course for Free! by downloading the Cursa app and reading the ebook there. Available on Google Play or App Store!

Get it on Google Play Get it on App Store

+ 6.5 million
students

Free and Valid
Certificate with QR Code

48 thousand free
exercises

4.8/5 rating in
app stores

Free courses in
video, audio and text