2010-04-23 18 views
112

Python'da 5.000'den fazla projeyi belgelemek için Sphinx'i kullanmaya çalışıyorum. Yaklaşık 7 temel modüle sahiptir. Gibi bildiğim kadarıyla, AutoDoc kullanmak için Projemde her dosya için böyle kod yazmak gerekir: Birçok dosyaları olduğu içinSphinx autodoc yeterince otomatik değil

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

Bu yol çok can sıkıcı. Belgelendirilecek 'mods' paketini istediğimi belirtmek çok daha kolay olurdu. Sfenks daha sonra tekrar tekrar paketin içinden geçebilir ve her alt modül için bir sayfa hazırlayabilir.

Böyle bir özellik var mı? Eğer olmasaydı, bütün .stst dosyalarını yapmak için bir betik yazabilirdim, ama bu çok zaman alacaktı.

+0

"os.walk" kullanan küçük bir komut dosyası yazmanın nesi var ve tüm bunları yazıyor? BTW, 40.000'den fazla hat projem var ve neden bahsettiğiniz hakkında net değil. Kaç dosya var? 'Ls 'dosyasını bir dosyaya yönlendirmek ve düzenlemek ne kadar zor olabilir? –

+98

Hiç kimse zor olduğunu söylemedi. OP, * sıkıcı * olduğunu söyledi. Diğer doktor sistemlerinin bunu yapabildiği göz önüne alındığında, bu mantıksız değildir. –

cevap

115

Yaptığım bu script numarasını kontrol edebilirsiniz. Sanırım size yardımcı olabilir.

Bu komut dosyası, python modülleri ve paketlerini arayan bir dizin ağacını ayrıştırır ve Sphinx ile kod belgeleri oluşturmak için ReST dosyalarını uygun şekilde oluşturur. Ayrıca bir modül indeksi oluşturur.

GÜNCELLEME

Artık bu komut dosyası apidoc olarak Sfenks 1.1 parçasıdır.

+0

Dosyaları nereden çıktı? Onları Sphinx'in varsayılan _build klasörüne çıkarmayı denedim, ancak sphinx-build -b html'yi çalıştırdım. ./_ build' onları kaldırmaz. – Cerin

+0

Onları “kaynak dizinine” yerleştirmelisiniz (sizin durumunuza göre). _build dizini, HTML dosyalarının oluşturulacağı yerdir. Daha fazla bilgi için kontrol edin: http://sphinx.pocoo.org/tutorial.html#running-the-build – Etienne

+1

@Erienne: fantastik script! Tam da aradığım şey. Tek tek sınıflar için oluşturulan başlıklar olmasını isteyin (düzenli sfenks görünümü, derslere hoş gelmez. Büyük modüller kaybolur) – jbenet

11

Her pakette, __init__.py dosya paketin her parçası için .. automodule:: package.module bileşenlerine sahip olabilir.

Sonra .. automodule:: package yapabilir ve çoğunlukla istediğinizi yapar.

+0

Sadece bu dizeyi __init__.py'deki üçlü tırnak içine koyuyorum? –

+4

@Cory Walker: "Bir" dizgi değil. Her bir dosyada üç tırnak işaretli docstrings koyabilirsiniz - ve ** olmalıdır. Herkes. Bu, paketlerinizde '__init __. Py' dosyalarını içerir. Docstring, paketteki modüller için '.. automodule ::' dahil HERHANGİ Sfenks dokümantasyon direktifini içerebilir. –

+2

'autodoc' bir yazım hatasıdır, 'automodule' olmalıdır. ama ipucu için çok teşekkürler! – mariotomo

27

ben Sfenks orijinal soru sorulmuştur anda autosummary uzantısı vardı mı bilmiyorum, ama şimdi onu sphinx-apidoc veya benzeri komut kullanmadan bu tür otomatik nesil kurmak oldukça mümkündür. Aşağıda projelerimden biri için çalışan ayarlar var.

  1. conf.py dosyada autosummary uzantısını (yanı sıra autodoc) etkinleştirme ve True onun autosummary_generate seçeneğini ayarlayın. Özel *.rst şablonlarını kullanmıyorsanız bu yeterli olabilir. Aksi halde, listeyi dışlamak için şablonlar dizini ekleyin veya autosummary bunları giriş dosyaları olarak ele almaya çalışın (bu bir hata gibi görünüyor). senin index.rst dosyada TOK ağacında

    extensions = ['sphinx.ext.autodoc', 'sphinx.ext.autosummary'] 
    autosummary_generate = True 
    templates_path = [ '_templates' ] 
    exclude_patterns = ['_build', '_templates'] 
    
  2. kullanın autosummary::. Bu örnekte project.module1 ve project.module2 modülleri için belgeler otomatik olarak oluşturulacak ve _autosummary dizinine yerleştirilecektir. Varsayılan autosummary olarak

    PROJECT 
    ======= 
    
    .. toctree:: 
    
    .. autosummary:: 
        :toctree: _autosummary 
    
        project.module1 
        project.module2 
    
  3. modülleri ve bunların fonksiyonları için sadece çok kısa özetleri üretecektir.Eğer (Jinja2 ile ayrıştırılır edileceği) _templates/autosummary/module.rst içine özel bir şablon dosyasını koyabilirsiniz bunu değiştirmek için: Sonuç olarak

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

, sürüm kontrolü altında _autosummary dizini tutmak için gerek yoktur. Ayrıca, istediğiniz herhangi bir şeyi adlandırabilir ve kaynak ağacında herhangi bir yere yerleştirebilirsiniz (bunun yerine _build'un altına işlenmeyecektir).

+1

Bu büyük bir yardımdır. "Project.module1" ve "project.module2" ye sahip olduğunuz 2. noktada, belirli bir paketteki her modül için o listeyi otomatik olarak oluşturmanın bir yolu var mı? Sadece "proje" koymak ve "module1" ve "module2" koklamak var mı? – Brown

+0

Oldukça şaşkın bir yer bulamıyorum, hiç uğraştın @Brown? –

+2

@AlisdairRobertson Hayır, ancak sağlanan otoimsi çözüm ihtiyaçlarim için yeterli olmaktan çıktı. Yapmayı düşündüğüm tek şey, index.rst dosyasını oluşturmak ve modül isimlerini otomatik olarak algılamak için bir komut dosyası yazmaktı. Bununla birlikte, pratikte, modüllerin listesi sık sık değişmez, bu yüzden bir dosyayı bir kerede bir kez düzenlemek mantıksız değildir. Eminim, bir dosya bulmak için gerekli olandan çok daha fazla zaman bir çözüm aramak için harcadım! – Brown

İlgili konular