DEV Community

loading...
Cover image for Distribute a Python App via Setup.py File

Distribute a Python App via Setup.py File

Niklas Tiede
I'm a chemist who likes to experiment with code. 😉 ⚗️
Originally published at the-coding-lab.com ・2 min read

Heya fellows,

The code of this post can be found on Github (see here).

We have seen that it's tedious and unclear how to distribute a project with a bash script. So I'll show you in this post the way to go: using a setup.py file!

We have to create a setup.py file, put it into the root directory and then we can use pip to install our project locally. This installs the project into the active virtual environment. But how does a setup.py file looks like? Here's a template containing the most important key-value pairs:

import setuptools

setuptools.setup(
    name="tihttp",
    version="0.1.0",

    package_dir={"": "src"},
    packages=setuptools.find_packages(where="src"),

    install_requires=[
        "requests>=2.21",
    ],

    entry_points={
        "console_scripts":
        ["tihttp=tihttp.main:run_main"]
        },
)
Enter fullscreen mode Exit fullscreen mode

The package_dir and packages values are necessary when a source layout is used, so that setup.py knows where to look for the packages. We used here a source layout to show these key-values and how they affect the entry_points section. The entry_points section tells pip where the command line tool is invoked from.

Alt Text

The command (in this case tihttp) is mapped to the starting point of the command line tool (here the run_main() function). Now tihttp can be installed and the command should return a proper help interface.

$ pip install .

$ tihttp --help
Enter fullscreen mode Exit fullscreen mode

Another big advantage of this setup is that pip allows to install packages in editable mode:

$ pip install -e .
Enter fullscreen mode Exit fullscreen mode

Your project is then installed into your currently activated virtual environment and every change to the code immediately affects this installed dependency. This allows to continue developing while testing the package comfortably. Furthermore, the setup.py file allows to download and install your project directly from github.

$ pip install https://github.com/NiklasTiede/tinyHTTPie/archive/5-Distributing-by-Setup-File.zip
Enter fullscreen mode Exit fullscreen mode

Direct installations from github can take time especially for projects which are bigger (large git history) and use non-Python languages. Therefore PyPI and Anaconda are usually the preferred places to go for installing packages.

I want to note that many developers in the python community store project metadata and settings used for linting/testing within a setup.cfg file instead of a setup.py file but this is a topic for another post.

Discussion (0)