Cover image for Part 3 Another Package with Cookiecutter

Part 3 Another Package with Cookiecutter

kodaman2 profile image Fernando B πŸš€ Originally published at kodaman2.github.io on ・3 min read

Cover Image Credit

Set your oven to 350F, or 175C in this post we will be baking a python package. This is the third installment in the series. In the previous post we've setup a basic package by manually creating the structure. In this post we will leverage a very cool package Cookiecutter. Cookiecutter can clone the directory of another repo or even a local directory. You'll have a python package ready in no time. There is a large database of templates too, not just for python.

Installing Cookiecutter

You can install cookiecutter with a pip command(Note: I am using pip3 because I also have py2 installed):

pip3 install cookiecutter

Create Package

On my git directory I can then run:

cookiecutter https://github.com/audreyr/cookiecutter-pypackage

Since github is the defacto for repositories you can also run:

cookiecutter gh:audreyr/cookiecutter-pypackage

Note: Make sure to say 2 for cli

All set and done:


In less than a minute a whole project was created with all necessary files for a python package.

Adding a Function to Test the Package

I use vscode, so inside the main package directory run:

code .

We'll reuse our say_hello function to make sure the project works as expected:

# -*- coding: utf-8 -*-

"""Main module."""
def say_hello(name):
    print("hello %s" % (name))

Installing the Package

Installing with dev argument same as before:

python3 setup.py develop

Testing say_hello function

At this point we can test our function. Launch python3 in the terminal or launch idle.

>>> from another_package import *
>>> say_hello("fer")

Won't run huh? We forgot to do one thing, and that is to add our python module to the init file. The reason it fails is that it doesn't know what functions to include in the package.

>>> from another_package import *
>>> say_hello("fer")
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
NameError: name 'say_hello' is not defined

Adding a py module to init

Open _init_.py inside the package folder, and below the version insert the following (note the dot before the module name):

from .another_package import *

Here we tell init to import all our functions.

Test 2

Exit python, and relaunch to reload another_package.

>>> from another_package import *
>>> say_hello("fer")
hello fer

With this process in place you won't be forgetting adding a readme file or a license ever again.

A word on cookiecutter

If you have a project that needs certain structure you can do another template. I usually just do python utilities and use the python template. If you need a specific template that doesn't exist already, make sure to read the docs on how to create a template.

Next Article

We have a working package, but it doesn't have any functionality at the moment. In the next post we'll add some functionality to run like a script from bash or cmd prompt. We will also learn how to use arguments with the argparse module. More fun to come, stay tuned!

For example:

say_hello -n "fer" -l "balandran"
output: hello fer balandran

Posted on by:

kodaman2 profile

Fernando B πŸš€


Coding space junkie with a sprinkle of writer heart. DMs open for any questions or comments. πŸ™‚


markdown guide