Here’s how to get a nice automatic documentation of your Python code using Sphinx. Sphinx can automagically slurp in all your docstrings, format them nicely, and render them as HTML or PDF output. Your docstrings end up looking so nice that sometimes it makes you want to write more of them! (which of course would result in better-documented code).
Install Sphinx
First you’ll need to get Sphinx. In Ubuntu,
$ sudo easy_install -U sphinx
Configure Sphinx for your module
Then change to your module’s root directory. I like to create a doc subdirectory, since Sphinx does clutter things up a little:
$ cd examplemodule $ mkdir doc $ cd doc
When you’re in the directory you want to have your docs in, run
$ sphinx-quickstart
Sphinx will walk you through the setup. Defaults are fine for everything, but make sure you choose y on the “autodoc” question. I’ve highlighted this below. Here’s the complete output of the sphinx-quickstart along with my answers.
Please enter values for the following settings (just press Enter to accept a default value, if one is given in brackets). Enter the root path for documentation. > Root path for the documentation [.]: You have two options for placing the build directory for Sphinx output. Either, you use a directory "_build" within the root path, or you separate "source" and "build" directories within the root path. > Separate source and build directories (y/N) [n]: Inside the root directory, two more directories will be created; "_templates" for custom HTML templates and "_static" for custom stylesheets and other static files. You can enter another prefix (such as ".") to replace the underscore. > Name prefix for templates and static dir [_]: The project name will occur in several places in the built documentation. > Project name: examplemodule > Author name(s): Code Monkey Sphinx has the notion of a "version" and a "release" for the software. Each version can have multiple releases. For example, for Python the version is something like 2.5 or 3.0, while the release is something like 2.5.1 or 3.0a1. If you don't need this dual structure, just set both to the same value. > Project version: 0.1 > Project release [0.1]: The file name suffix for source files. Commonly, this is either ".txt" or ".rst". Only files with this suffix are considered documents. > Source file suffix [.rst]: One document is special in that it is considered the top node of the "contents tree", that is, it is the root of the hierarchical structure of the documents. Normally, this is "index", but if your "index" document is a custom template, you can also set this to another filename. > Name of your master document (without suffix) [index]: Please indicate if you want to use one of the following Sphinx extensions: > autodoc: automatically insert docstrings from modules (y/N) [n]: y > doctest: automatically test code snippets in doctest blocks (y/N) [n]: > intersphinx: link between Sphinx documentation of different projects (y/N) [n]: > todo: write "todo" entries that can be shown or hidden on build (y/N) [n]: > coverage: checks for documentation coverage (y/N) [n]: > pngmath: include math, rendered as PNG images (y/N) [n]: > jsmath: include math, rendered in the browser by JSMath (y/N) [n]: > ifconfig: conditional inclusion of content based on config values (y/N) [n]: A Makefile and a Windows command file can be generated for you so that you only have to run e.g. `make html' instead of invoking sphinx-build directly. > Create Makefile? (Y/n) [y]: > Create Windows command file? (Y/n) [y]: n Finished: An initial directory structure has been created. You should now populate your master file ./index.rst and create other documentation source files. Use the Makefile to build the docs, like so: make builder where "builder" is one of the supported builders, e.g. html, latex or linkcheck.
Edit index.rst
Now you’re ready to edit the index.rst page. All you need for this minimal setup is to add an automodule directive for the module (to tell Sphinx what the current module is that’s being documented) and then the autoclass directive for each class you want to have documented. The :members: command tells Sphinx to document any class members that have a docstring.
.. automodule:: examplemodule
.. autoclass:: myClass
:members:
.. autoclass:: anotherClass
:members:
So here’s what a complete index.rst might look like for a module with two classes that I want to document:
.. pybedtools documentation master file, created by
sphinx-quickstart on Tue Apr 13 18:15:46 2010.
You can adapt this file completely to your liking, but it
should at least contain the root `toctree` directive.
Welcome to examplemodule's documentation!
=========================================
Contents:
.. toctree::
:maxdepth: 2
.. automodule:: examplemodule
.. autoclass:: myClass
:members:
.. autoclass:: anotherClass
:members:
Indices and tables
==================
* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`
The Sphinx documentation site has more info on the documentation for the autodoc extension, for example, specifying only a couple of members or documenting functions.
Make sure your module is importable
Sphinx actually imports your module in order to get all the docstrings. So you’ll need to make sure that your module is importable. Easiest way is to add it to your PYTHONPATH:
$ export PYTHONPATH=$PYTHONPATH:/path/to/examplemodule
Create the docs
Now, from within the documentation directory, create HTML docs with
$ make html
and open the file _build/html/index.html to see your new documentation.
If you want to go the fancy PDF route, you’ll need to make sure you have LaTeX on your machine. An easy way to get it on Ubuntu is to install Kile, which will automatically install all of Kile’s LaTeX dependencies
$ sudo apt-get install kile
Once you have LaTeX, make the PDF docs with
$ make latex $ cd _build/latex $ make all-pdf
and then open the file _build/latex/examplemodule.pdf to see the results.
Results
Here’s a screenshot of the HTML version:

And here’s the PDF output:
examplemodule.pdf
Again, the autodoc documentation has lots more info for further customizing this.
This is completely awesome :) Thank you for making this subject more clear! Before reading this I quickly discarded Sphynx as I got the impression it wasn’t able to generate documentation from docstrings.
Thank you Sir :) Great post.
I’ve noticed small bug in autodoc ext link.
Ah thanks. I fixed it so it works now.
Simple, concise, helped a lot! The official sphinx doc examples were lacking clarity for me. This cleared it right up.
Thanks for the post!
> $ export PYTHONPATH=$PYTHONPATH:/path/to/examplemodule
You can also set the sys.path in the conf.py. I wish I found your site before I started documentation. It would have saved a lot of time.
Amazing! I greatly appreciate the straight forward outline of how to do this, many thanks!
I used these procedures and all the docstrings were included in the html output exactly as I expected. However, just as in your example the pdf file did not continue any of the docstring or function header information.
Is there a way to have all the information that is generated for html also generated when using pdf??? I know sphinx is html oriented but often printed documentation is more appropriate and sphinix doesn’t seem to generate the docstring info just the index of all the routines.
Erich
I tried generating a pdf using the sphinx-build -b latex and then pdflatex (twice to get the cross referencing correct) and got the docstrings in the pdf. I also tried using the sphinx-build -b latex and then using the make file that it created. It also included the docstrings. However the way that you suggested just leads to a listing of the module contents in the index but no docstring data. It seems strange as based on all the info, it ought to be the same.
I also added another module but it doesn’t start on a new page and with the Contents: Instead it starts right after the previous module and the indentation makes it seem as if the new module were really part of the previous one. Anyway to specify the output here??
At the same time I want to thank you for providing the minimal tutorial. It was very helpful to getting something out of Sphinx. Thanks!!!!
Erich
Erich –
This is an old post and I haven’t had time to update it . . . I just tested Sphinx 1.0.7, and made a pdf with
The docstrings in my documentation come out OK with this method.
As far as the modules, you could try making a new .rst file, adding the automodule directive to it, and adding a top-level title before the .. automodule:: directive. Then you could add this file under the Contents.
e.g., mymodule_rst.rst might look like:
and the new Contents would include an entry:
.. toctree:: mymodule_rstThanks a lot! For django this was also hepful – http://task3.cc/53/document-your-django-project-using-sphinx-documentation-tool-and-restructuredtext/
Hi – a very nice overview… only problem is that when I run:
make html
I get:
make: *** No rule to make target `html’. Stop.
Any ideas or pointers as to how to solve this? Thanks!
If you want to automate the documentation process even more, you can use apidoc to generate the .rst files for you. see http://sphinx.pocoo.org/man/sphinx-apidoc.html