Create python package

Problem:

You have created some code that solves a specific problem and think others probably have the same problem. To help them you want to create and publish your own python package that can be installed with pip. But you don’t know how?

Solution:

To create your own python package you need to do the following steps:

  • Register on PyPi.org
  • Install requirements
  • Setup folder structure
  • Compile your package
  • Test on your local machine
  • Upload

Register on PyPi.org

Many packages are hosted on pypi.org. To be able to easily share your package and give others the option to install it like any other package, you need to host it on PyPi.

To be allowed to do so you need to register there. Jump to https://pypi.org/account/register/, register your account and finish the email validation.

Install requirements

Setuptools: The standard package development process library for python

Wheel: The package to create the .whl files that pip installs.

Twine: Have a secure, authenticated, and verified connection with pypi.org for uploading your package.

Tqdm: Progress meter internally used by Twine

To install them run:

python -m pip install –upgrade pip setuptools wheel

python -m pip install tqdm

python -m pip install –upgrade twine

You can run this in your virtualenv if you want and don´t need to handle system or user level problems.

Setup folder structure

To use the best practice from https://packaging.python.org/tutorials/packaging-projects/, create a main folder for your project, e.g. my-package.

Change into the directory, with cd my-package

Inside of it create the following files:

LICENSE

README.md

setup.py

In the same folder create the subfolders:

tests

my-package

Finally create a file __init__.py inside of my-package\my-package. This will contain (some of) your source code.

LICENSE

Go to https://choosealicense.com/ and select a license. Then copy the provided license text into your LICENSE file. That´s it.

README.md

This file can contain the longer explanation and examples for your code in MarkDown. Fill as required.

setup.py

This file describes the details of your package, requirements, category, etc. It is equivalent to package.json for nodejs.

The following template is a copy with many thanks from https://packaging.python.org/tutorials/packaging-projects/ :

import setuptools

with open("README.md", "r", encoding="utf-8") as fh:
    long_description = fh.read()

setuptools.setup(
    name="example-pkg-YOUR-USERNAME-HERE", # Replace with your own username
    version="0.0.1",
    author="Example Author",
    author_email="[email protected]",
    description="A small example package",
    long_description=long_description,
    long_description_content_type="text/markdown",
    url="https://github.com/pypa/sampleproject",
    packages=setuptools.find_packages(),
    classifiers=[
        "Programming Language :: Python :: 3",
        "License :: OSI Approved :: MIT License",
        "Operating System :: OS Independent",
    ],
    python_requires='>=3.6',
)

Fill in your data.

Author and author email need to match your PyPi.org account. Link it to your hosting.

tests

This folder will contain the different ci/cd tests for your code. In the beginning it´s probably emptry.

my-package/__init__.py

This file will contain the part of your code that you want to expose, the functions you want the user to be able to call directly from your package.

It´s the entry point to your code, think def main().

Your remaining code will find it´s place inside my-package and subfolders.

final directory structure (user test and home directory in /home: /home/test as base):

/home/test/my-package/
/home/test/my-package/my-package/
/home/test/my-package/my-package/__init__.py
/home/test/my-package/setup.py
/home/test/my-package/LICENSE
/home/test/my-package/README.md
/home/test/my-package/tests/

Compile your package

To compile your package into a .whl file, execute:

python setup.py bdist_wheel

Test on your local Machine

To test your package before you upload, install it with:

python -m pip install dist/my-package*

Look into the dist folder and get the correct naming. It depends on the data you supplied setup.py.

Upload

As preparation for the upload of the package, you need to create a ~/.pypirc (in your home directory, not the local package directory)

Add this content inside of it (adjust username):

[distutils]
index-servers=pypi
[pypi]
repository = https://upload.pypi.org/legacy
username = my_pypi_username

Now run

python -m twine upload dist/*

It may ask you for your pypi.org password. In that case please enter it.

Result

You now have created your own python package. And if someone wants to use it, they can run pip install $yourPackageName as they are used to.

Try it!

Let me know when it helped you.

Best,
Frank

Sources:

https://docs.saleor.io/docs/developer/running-saleor/emails/

https://packaging.python.org/tutorials/packaging-projects/

https://betterscientificsoftware.github.io/python-for-hpc/tutorials/python-pypi-packaging/

https://dzone.com/articles/executable-package-pip-install

Leave a Reply