Search code examples
pythonpython-sphinxsetuptoolssetup.pydoctest

How can I run Sphinx doctests as part of setup.py?


I want to include a setuptools command to run Sphinx doctest as part of my package setup.py, like this:

$ python setup.py sphinx_doctest

I have a package structure like:

my_pkg
|---__init__.py
|---module1.py    # Containing reStructuredText docstrings with examples
docs
|---build
|---|---doctrees
|---source
|---|---conf.py   # Sphinx config
|---|---index.rst # Sphinx index file
setup.py

How can I implement a setuptools command that does the equivalent of:

$ sphinx-build -b doctest -d docs/build/doctrees docs/source docs/build

Solution

  • Subclass setuptools.Command and use sphinx.application.Sphinx to launch the sphinx.ext.doctest builder.

    In setup.py:

    from setuptools import setup, Command
    
    class Doctest(Command):
        description = 'Run doctests with Sphinx'
        user_options = []
    
        def initialize_options(self):
            pass
    
        def finalize_options(self):
            pass
    
        def run(self):
            from sphinx.application import Sphinx
            sph = Sphinx('./docs/source', # source directory
                         './docs/source, # directory containing conf.py
                         './docs/build', # output directory
                         './docs/build/doctrees', # doctree directory
                         'doctest') # finally, specify the doctest builder
            sph.build()
    
    sphinx_requires = ['sphinx>=1.3.1']
    
    setup(
        name='mypkg',
        version='0.0.1',
        description='My Package',
        packages=['mypkg'],
        cmdclass={
            'doctests': Doctest
        },
        extras_require={
            'build_sphinx': sphinx_requires,
        },
    )