2010-04-23 18 views
112

Sto provando a usare Sphinx per documentare un progetto di oltre 5.000 linee in Python. Ha circa 7 moduli base. Per quanto ne so, Per poter utilizzare autodoc ho bisogno di scrivere codice come questo per ogni file nel mio progetto:L'autodoc di Sphinx non è abbastanza automatico

.. automodule:: mods.set.tests 
    :members: 
    :show-inheritance: 

questo è il modo troppo noioso perché ho molti file. Sarebbe molto più semplice se potessi semplicemente specificare che volevo che il pacchetto "mods" fosse documentato. Sfinge potrebbe quindi ricorsivamente passare attraverso il pacchetto e creare una pagina per ogni sottomodulo.

C'è una funzionalità come questa? Altrimenti potrei scrivere uno script per creare tutti i file .rst, ma ciò richiederebbe molto tempo.

+0

Cosa c'è di sbagliato con la scrittura di un piccolo script che utilizza "os.walk" e scrive tutto questo? A proposito, ho un progetto di oltre 40.000 linee e non sono chiaro su cosa stai parlando. Quanti file sono coinvolti? Quanto può essere difficile instradare 'ls' in un file e modificarlo? –

+98

Nessuno ha detto che era difficile. OP disse che era * tedioso *, che è. Dato che altri sistemi di documentazione possono farlo, non è irragionevole. –

risposta

115

È possibile controllare questo script che ho fatto. Penso che possa aiutarti.

Questo script analizza un albero di directory alla ricerca di moduli e pacchetti python e crea file di ripristino in modo appropriato per creare la documentazione del codice con Sphinx. Crea anche un indice di moduli.

UPDATE

questo script è ora parte della Sfinge 1.1 come apidoc.

+0

Dove si devono inviare i file? Ho provato a esportarli nella cartella _build predefinita di Sphinx, ma eseguendo 'sphinx-build -b html. ./_ build' non li raccoglie. – Cerin

+0

Dovresti metterli nella 'directory sorgente' (. Nel tuo caso). La directory _build è dove verranno creati i file HTML. Per ulteriori informazioni: http://sphinx.pocoo.org/tutorial.html#running-the-build – Etienne

+1

@Erienne: script fantastico! Proprio quello che stavo cercando. Vogliamo generare intestazioni per classi individuali (l'aspetto regolare della sfinge non è bello per le classi, si perdono nei moduli più grandi) – jbenet

11

In ogni pacchetto, il file __init__.py può avere componenti .. automodule:: package.module per ciascuna parte del pacchetto.

Quindi è possibile .. automodule:: package e fa principalmente quello che vuoi.

+0

devo semplicemente mettere quella stringa tra virgolette in __init__.py? –

+4

@Cory Walker: non è una stringa "a". Puoi - e ** dovrebbe ** - inserire docstring con quotatura tripla in ogni singolo file. Tutti. Ciò include i file '__init __. Py' nei tuoi pacchetti. La docstring può includere tutte le direttive della documentazione della Sfinge, incluso '.. automodule ::' per i moduli all'interno del pacchetto. –

+2

'autodoc' è un refuso, dovrebbe essere' automodule'. ma grazie mille per il suggerimento! – mariotomo

27

Non so se Sphinx avesse avuto l'estensione autosummary al momento della domanda originale, ma per ora è abbastanza possibile impostare una generazione automatica di questo tipo senza usare lo sphinx-apidoc o uno script simile. Di seguito ci sono le impostazioni che funzionano per uno dei miei progetti.

  1. Abilita autosummary estensione (così come autodoc) in conf.py file e impostare l'opzione autosummary_generate-True. Questo potrebbe essere sufficiente se non si utilizzano modelli personalizzati *.rst. Altrimenti aggiungi la tua directory modelli per escludere l'elenco, oppure autosummary proverà a trattarli come file di input (che sembra essere un bug).

    extensions = ['sphinx.ext.autodoc', 'sphinx.ext.autosummary'] 
    autosummary_generate = True 
    templates_path = [ '_templates' ] 
    exclude_patterns = ['_build', '_templates'] 
    
  2. Usa autosummary:: in albero di TOC nel file index.rst. In questo esempio, la documentazione per i moduli project.module1 e project.module2 verrà generata automaticamente e inserita nella directory _autosummary.

    PROJECT 
    ======= 
    
    .. toctree:: 
    
    .. autosummary:: 
        :toctree: _autosummary 
    
        project.module1 
        project.module2 
    
  3. Per default autosummary genererà solo sintesi molto brevi per i moduli e le loro funzioni.Per cambiare che si può mettere un file di modello personalizzato in _templates/autosummary/module.rst (che verrà analizzato con Jinja2):

    {{ fullname }} 
    {{ underline }} 
    
    .. automodule:: {{ fullname }} 
        :members: 
    

In conclusione, non v'è alcuna necessità di mantenere _autosummary directory sotto controllo di versione. Inoltre, puoi nominarlo come vuoi e posizionarlo ovunque nell'albero dei sorgenti (ma non lo puoi applicare al di sotto di _build).

+1

Questo è stato di grande aiuto. Nel punto 2, in cui sono presenti "project.module1" e "project.module2", esiste un modo per generare automaticamente quell'elenco per ogni modulo in un determinato pacchetto? Basta mettere "progetto" e farlo annusare "module1" e "module2"? – Brown

+0

Piuttosto sorpreso non riesco a trovare una risposta a questo ovunque, non hai mai escogitato? –

+2

@AlisdairRobertson No, ma la soluzione di autosummary fornita è risultata più che adeguata per le mie esigenze. L'unica altra cosa che ho pensato di fare era scrivere uno script per generare il file index.rst e riconoscere automaticamente i nomi dei moduli. Tuttavia, in pratica, l'elenco dei moduli non cambia così spesso, quindi modificare un solo file una volta ogni tanto non è irragionevole. Sono sicuro che ho già passato molto più tempo a cercare una soluzione di quanto basta per modificare quel file! – Brown

Problemi correlati