How to use Python to programmatically generate part of Sphinx documentation?

前端 未结 6 1298
悲&欢浪女
悲&欢浪女 2020-12-13 07:16

I am using Sphinx to generate the documentation for a project of mine.

In this project, I describe a list of available commands in a yaml file which, once loaded, r

6条回答
  •  攒了一身酷
    2020-12-13 07:59

    An improvement based on Michael's code and the built-in include directive:

    import sys
    from os.path import basename
    
    try:
        from StringIO import StringIO
    except ImportError:
        from io import StringIO
    
    from docutils.parsers.rst import Directive    
    from docutils import nodes, statemachine
    
    class ExecDirective(Directive):
        """Execute the specified python code and insert the output into the document"""
        has_content = True
    
        def run(self):
            oldStdout, sys.stdout = sys.stdout, StringIO()
    
            tab_width = self.options.get('tab-width', self.state.document.settings.tab_width)
            source = self.state_machine.input_lines.source(self.lineno - self.state_machine.input_offset - 1)
    
            try:
                exec('\n'.join(self.content))
                text = sys.stdout.getvalue()
                lines = statemachine.string2lines(text, tab_width, convert_whitespace=True)
                self.state_machine.insert_input(lines, source)
                return []
            except Exception:
                return [nodes.error(None, nodes.paragraph(text = "Unable to execute python code at %s:%d:" % (basename(source), self.lineno)), nodes.paragraph(text = str(sys.exc_info()[1])))]
            finally:
                sys.stdout = oldStdout
    
    def setup(app):
        app.add_directive('exec', ExecDirective)
    

    This one imports the output earlier so that it goes straight through the parser. It also works in Python 3.

提交回复
热议问题