earn the White PyBites Ninja earn the Yellow PyBites Ninja earn the Orange PyBites Ninja right arrow earn more PyBites Ninja belts and certificates
The best way to learn to code in Python is to actually use the language.

Our platform offers effective Test Driven Learning which will be key to your progress.


Join thousands of Pythonistas and start coding!


Join us on our PyBites Platform
Click here to code!

Bootstrap Your Next Python Project With Cookiecutter

Posted by Bob on Wed 25 October 2017 in Tools • 3 min read

I finally did it! I bootstrapped my first project with Cookiecutter. There is a lot to discover but wow this tool can save you a ton of time, making your project more professional.

This is just a quick article to document this nice tool brought to us by the authors of Two Scoops of Django.

Cookiecutter does one thing and it does it well - Daniel Roy Greenfeld

Installation

First I ran a pip install but I could not find it in my path so I went full force with:

brew install cookiecutter

That's on Mac. On Ubuntu you would do:

sudo apt-get install cookiecutter

As it's a tool I will use to boostrap various projects I think having it outside a virtualenv is justified.

How to start

The best place to check out is their latest documentation jumping straight to the usage section.

At first I pulled the repo and filled out the cookiecutter.json, a convenient defaults file for hands off (--no-input) project creation.

The interactive option is convenient too:

$ cookiecutter gh:audreyr/cookiecutter-pypackage
full_name [Audrey Roy Greenfeld]: Bob Belderbos
email [aroy@alum.mit.edu]: info@bobbelderbos.com
github_username [audreyr]: bbelderbos
project_name [Python Boilerplate]: PyBites Hacktoberfest Checker
project_slug [pybites_hacktoberfest_checker]:
project_short_description [Python Boilerplate contains all the boilerplate you need to create a Python package.]: Checking number of PRs done in Oct for the Digital Ocean's Hacktoberfest challenge. Also my first Bottle app.
pypi_username [bbelderbos]:
version [0.1.0]:
use_pytest [n]: y
use_pypi_deployment_with_travis [y]:
Select command_line_interface:
1 - Click
2 - No command-line interface
Choose from 1, 2 [1]:
create_author_file [y]:
Select open_source_license:
1 - MIT license
2 - BSD license
3 - ISC license
4 - Apache Software License 2.0
5 - GNU General Public License v3
6 - Not open source
Choose from 1, 2, 3, 4, 5, 6 [1]:

I only then realized that there are project based cookiecutters so I picked the bottle one, the micro web-framework I want to use for our code challenge 38.

It could not be easier: just point to the Github repo. It is more bare bones than cookiecutter-pypackage though:

$ cookiecutter https://github.com/avelino/cookiecutter-bottle.git
full_name [Thiago Avelino]: Bob Belderbos
email [thiago@avelino.xxx]: info@bobbelderbos.com
github_username [avelino]: bbelderbos
project_name [My Bottle App]: PyBites Hacktoberfest Checker
app_name [mybottleapp]: hacktoberfestapp
project_short_description [A cookiecutter template for creating reusable Bottle projects quickly]: Checking number of PRs done in Oct for the Digital Ocean's Hacktoberfest challenge. Also my first Bottle app.

At this point you can cd into it, do a git init, make a virtual env and install the requirements:

$ virtualenv -p /Users/bbelderb/anaconda/bin/python venv
$ echo "venv" >> .gitignore
$ source venv/bin/activate
(venv) $ pip install -r requirements.txt
...
(venv) $ git init
Initialized empty Git repository in /Users/bbelderb/code/hacktoberfestapp/.git/
(venv) $ git status
...

    .gitignore
    README.rst
    hacktoberfestapp/
    manage.py
    requirements.txt
    tests/

(venv) $ git add . && git commit -m "init commit"
(venv) $ python manage.py  runserver
...
Listening on http://0.0.0.0:8080/

Nice:

default Bottle cookiecutter homepage

And here is the directory structure with some bootstrap code:

Bottle bootstrap folder structure and files

Conclusion

I think the main take away is that Cookiecutter takes a lot of worries away regarding setup, folder structure, required files, etc. It might be overkill for some projects, but it does add consistency across your projects and endorses best practices.

I only scratched the service. I really would like to try cookiecutter-flask, cookiecutter-django and cookiecutter-django-rest for future projects. Or how to create our own PyBites Cookiecutter? And what about defining pre- and post-generate hooks (Python or shell scripts to run before or after generating a project)? Enough to explore for a follow-up article ...

Feel free to share what you have used Cookiecutter for in the comments below.

cookiecutter is a nice and clean way to bootstrap a Python project

Further resources


Keep Calm and Code in Python!

-- Bob


See an error in this post? Please submit a pull request on Github.