Creating and publishing Python modules

I once developed a simple script to fetch course schedule and plan a timetable for myself. Later, I turned it into a Python module and published it to PyPi. Now, the module can be installed with just a simple pip install command. I would like to share with you how I created a Python module and successfully uploaded it to PyPi.

Creating Python modules

Creating Python modules are easier than most of you might think. All you need is a file named __init__.py, and it could even be just an empty file! Suppose we have the following files

[testmod]/
├── __init__.py
└── main.py

This creates a Python module named testmod. If we have the following code in main.py

def add(a, b):
    return a + b

Now when you start the Python interpreter from testmod’s parent directory, you can import your testmod module just like any other module you’d like to import

>>> from testmod.main import add
>>> add(9, 7)
16

There goes our simple Python module! Once you understand the concept, you can build much complex modules with it.

By the way, if you put any Python code in __init__.py, it will be executed every time you import that module. If you need some initialization done when your module gets imported, you should put that part of the code into __init__.py.

Publishing Python modules to PyPi

Now that you have a simple Python module built, you could publish it to PyPi so that it can be installed via pip install.

Dependencies

Make sure you have everything you need before we continue. You need to have pip, setuptools, and twine installed for your Python interpreter. The first two usually comes with Python, install twine with

$ pip install twine

Configuration files

You need to add some configuration files to your module before you publish it to PyPi. Here we only consider the file setup.py that is required.

setup.py

This is the most important file that you will need. This file should exist in your module’s parent directory. The setup.py file specifies how you would like your module configured. It contains a setup() function that includes all that information. Here is an example setup.py file.

from setuptools import setup

long_description = """
This is the long description for testmod.
"""

setup(
	name = "testmod", # name of your module
	version = "0.0.1", # version of your module
	description = "A short description for testmod.", # a short description
	long_description = long_description, # a long description
	url = "http://example.com", # project homepage URL
	author = "Someone", # your name
	author_email = "me@example.com", # your email
	keywords = "testing sample", # keywords for your module
	packages = ["testmod"], # packages to include (we only have one)
	#install_requires = [] # if your project has dependencies, list it here
)

Creating distributions

You need to create distributions of your project before you could upload it to PyPi. Here we will create a binary distribution which users can just download and use. Run

$ python setup.py bdist_wheel --universal

This assumes that your module can be used for both Python 2 & 3 (hence the --universal flag). You will find a dist directory containing your build.

Uploading to PyPi

First register an account at PyPi. Then save your account credentials in ~/.pypirc like this

[distutils]
index-servers = pypi

[pypi]
repository = https://pypi.python.org/pypi
username = <your username>
password = <your password>

Next, register your project (if this is the first time you are uploading to PyPi) with

$ twine register dist/testmod-0.0.1-py2.py3-none-any.whl

and upload it to PyPi with

$ twine upload dist/*

There you have it. Your module is on PyPi! You can now install it with pip install testmod. (You may need to wait a few hours for the PyPi index to update)

Note: Please note that the module testmod already exists on PyPi, therefore your commands will fail. I’m only using the name for demo purposes. Use the actual name of your module to run the above commands.

References

 
comments powered by Disqus