स्फिंक्स ऑटोडोक पर्याप्त स्वचालित नहीं है


149

मैं स्फिंक्स का उपयोग करने के लिए पायथन में 5,000+ लाइन परियोजना के दस्तावेज का उपयोग कर रहा हूं। इसमें लगभग 7 बेस मॉड्यूल हैं। जहां तक ​​मुझे पता है, ऑटोडोक का उपयोग करने के लिए मुझे अपनी परियोजना में प्रत्येक फ़ाइल के लिए इस तरह कोड लिखना होगा:

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

यह रास्ता बहुत थकाऊ है क्योंकि मेरे पास कई फाइलें हैं। यह बहुत आसान होगा यदि मैं केवल यह निर्दिष्ट कर सकूं कि मैं 'मॉड्स' पैकेज चाहता था। स्फिंक्स फिर से पैकेज के माध्यम से जा सकता है और प्रत्येक सबमॉड्यूल के लिए एक पेज बना सकता है।

क्या इस तरह की कोई विशेषता है? यदि मैं सभी .rst फ़ाइलों को बनाने के लिए स्क्रिप्ट नहीं लिख सकता था, लेकिन इसमें बहुत समय लगेगा।


एक छोटी सी स्क्रिप्ट लिखने में क्या गलत है जो "os.walk" का उपयोग करता है और यह सब लिखता है? BTW, मुझे एक 40,000+ लाइन परियोजना मिली है और आप जिस बारे में बात कर रहे हैं उस पर अस्पष्ट हैं। कितनी फाइलें शामिल हैं? lsफ़ाइल को रूट करना और उसे संपादित करना कितना कठिन हो सकता है?
एस.लॉट

125
किसी ने नहीं कहा कि यह कठिन था। ओपी ने कहा कि यह थकाऊ था , जो यह है। यह देखते हुए कि अन्य डॉक्टर सिस्टम ऐसा कर सकते हैं, यह अनुचित नहीं है।
ग्रेग लिंड

बस pdoc का उपयोग करें
K3 --- rnc

जवाबों:


143

आप इस स्क्रिप्ट को देख सकते हैं जो मैंने बनाया है। मुझे लगता है कि यह आपकी मदद कर सकता है।

यह स्क्रिप्ट एक निर्देशिका ट्री को अजगर मॉड्यूल और पैकेजों की तलाश में खड़ा करती है और स्फिंक्स के साथ कोड प्रलेखन बनाने के लिए उचित रूप से ReST फाइलें बनाती है। यह एक मॉड्यूल इंडेक्स भी बनाता है।

अपडेट करें

यह स्क्रिप्ट अब एपिडोक के रूप में स्फिंक्स 1.1 का हिस्सा है ।


आप फ़ाइलों को आउटपुट कहाँ करने वाले हैं? मैंने उन्हें स्फिंक्स के डिफ़ॉल्ट _build फ़ोल्डर में आउटपुट करने की कोशिश की, लेकिन रनिंग sphinx-build -b html . ./_buildउन्हें नहीं उठाती है ।
सेरिन

आपको उन्हें source directory(आपके मामले में) रखना चाहिए । _Build निर्देशिका वह जगह है जहां HTML फाइलें बनाई जाएंगी। अधिक जानकारी के लिए देखें: sphinx.pocoo.org/tutorial.html#running-the-build
Etienne

1
@ एरीएन: शानदार स्क्रिप्ट! मुझे इसकी ही खोज थी। काश यह व्यक्तिगत कक्षाओं के लिए शीर्षक उत्पन्न करता (नियमित स्फिंक्स लुक कक्षाओं के लिए अच्छा नहीं होता। वे बड़े मॉड्यूल में खो जाते हैं)
jebet

1
यहां तक ​​कि स्फिंक्स-एपिडोक सुंदर अल्पविकसित है। एक या दो मॉड्यूल वाले पैकेज के लिए, यह ठीक काम करता है, लेकिन हमने मॉड्यूल को गहराई से नेस्टेड कर दिया है, और स्फिंक्स-एपिडोक कुछ बहुत असहनीय आउटपुट पैदा करता है।
स्लिस

4
स्व उत्तर देना: .. include:: modules.rstअपने में जोड़ेंindex.rst
सिरो संतिली 病 to to to

40

मुझे नहीं पता कि autosummaryमूल प्रश्न पूछे जाने के समय स्फिंक्स का विस्तार था या नहीं , लेकिन अब इसके लिए उस तरह की sphinx-apidocस्क्रिप्ट का उपयोग किए बिना या उस तरह की स्वचालित पीढ़ी को स्थापित करना काफी संभव है । नीचे ऐसी सेटिंग्स हैं जो मेरे किसी प्रोजेक्ट के लिए काम करती हैं।

  1. फ़ाइल में autosummaryएक्सटेंशन (साथ ही साथ autodoc) सक्षम करें conf.pyऔर इसका autosummary_generateविकल्प सेट करें True। यदि आप कस्टम *.rstटेम्पलेट का उपयोग नहीं कर रहे हैं तो यह पर्याप्त हो सकता है । अन्यथा सूची को बाहर करने के लिए अपनी टेम्प्लेट निर्देशिका को जोड़ें, या autosummaryउन्हें इनपुट फ़ाइलों (जो बग प्रतीत होता है) के रूप में व्यवहार करने की कोशिश करेंगे।

    extensions = ['sphinx.ext.autodoc', 'sphinx.ext.autosummary']
    autosummary_generate = True
    templates_path = [ '_templates' ]
    exclude_patterns = ['_build', '_templates']
  2. autosummary::अपनी index.rstफ़ाइल में TOC ट्री का उपयोग करें । इस उदाहरण में मॉड्यूल के लिए प्रलेखन project.module1और project.module2स्वचालित रूप से उत्पन्न किया जाएगा और _autosummaryनिर्देशिका में रखा जाएगा ।

    PROJECT
    =======
    
    .. toctree::
    
    .. autosummary::
       :toctree: _autosummary
    
       project.module1
       project.module2
  3. डिफ़ॉल्ट रूप autosummaryसे मॉड्यूल और उनके कार्यों के लिए केवल बहुत कम सारांश उत्पन्न होंगे। यह बदलने के लिए कि आप एक कस्टम टेम्प्लेट फ़ाइल में डाल सकते हैं _templates/autosummary/module.rst( जिन्जा 2 के साथ पार्स किया जाएगा ):

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

निष्कर्ष में, _autosummaryसंस्करण नियंत्रण के तहत निर्देशिका रखने की आवश्यकता नहीं है । इसके अलावा, आप इसे अपनी इच्छानुसार कुछ भी नाम दे सकते हैं और इसे स्रोत के पेड़ में कहीं भी रख सकते हैं (इसे नीचे रखना _buildकाम नहीं करेगा, हालांकि)।


4
यह बहुत बड़ी मदद थी। बिंदु 2 में, जहां आपके पास "project.module1" और "project.module2" है, क्या किसी दिए गए पैकेज में प्रत्येक मॉड्यूल के लिए स्वचालित रूप से उस सूची को उत्पन्न करने का एक तरीका है? सिर्फ "प्रोजेक्ट" लगाने के लिए और क्या यह "मॉड्यूल 1" और "मॉड्यूल 2" को सूँघता है?
ब्राउन

बहुत आश्चर्य की बात है कि मुझे कहीं भी इसका जवाब नहीं मिला, क्या आपने कभी इसे @Brown किया है?
एलिसडेयर रॉबर्टसन

3
@ एलिसडेयर रॉबर्टसन नहीं, लेकिन प्रदान की गई ऑटोसुमरी समाधान मेरी आवश्यकताओं के लिए पर्याप्त से अधिक होने के कारण समाप्त हो गया। केवल दूसरी चीज जो मैंने करने का सोचा था वह था सूचकांक लिपि को उत्पन्न करने के लिए एक स्क्रिप्ट लिखना। हालाँकि, व्यवहार में, मॉड्यूल की सूची में अक्सर बदलाव नहीं होता है, इसलिए बस एक बार एक फ़ाइल को संपादित करना अनुचित नहीं है। मुझे यकीन है कि मैं पहले से ही एक समाधान की तलाश में अधिक समय बिता रहा हूं, यह सिर्फ एक फ़ाइल को संपादित करने के लिए लेता है!
ब्राउन

12

प्रत्येक पैकेज में, __init__.pyफ़ाइल हो सकती है.. automodule:: package.module में पैकेज के प्रत्येक भाग के लिए घटक ।

तब आप कर सकते हैं .. automodule:: packageऔर यह ज्यादातर वही करता है जो आप चाहते हैं।


क्या मैं उस स्ट्रिंग को init .py में ट्रिपल कोट्स में डाल सकता हूँ ?
कोरी वॉकर

5
@ कोरी वॉकर: यह "ए" स्ट्रिंग नहीं है। आप कर सकते हैं - और चाहिए - हर एक फ़ाइल में ट्रिपल-उद्धृत docstrings डाल रहा है। हर कोई। इसमें __init__.pyआपके पैकेज की फाइलें शामिल हैं। डॉक्स्ट्रिंग .. automodule::में पैकेज के भीतर मॉड्यूल सहित किसी भी स्फिंक्स प्रलेखन निर्देश शामिल हो सकते हैं ।
२.२५:

2
autodocएक टाइपो है, यह होना चाहिए automodule। लेकिन संकेत के लिए बहुत बहुत धन्यवाद!
मारीतोमो

9

स्फिंक्स संस्करण 3.1 (जून 2020) से, sphinx.ext.autosummary (अंत में!) में पुनरावृत्ति होती है।

तो हार्ड कोड मॉड्यूल नामों की जरूरत नहीं है या Sphinx AutoAPI या Sphinx AutoPackageSummary जैसी 3 पार्टी लाइब्रेरी पर निर्भर हैं अपने स्वचालित पैकेज का पता लगाने के लिए ।

उदाहरण के लिए पाइथन 3.7 पैकेज टू डॉक्यूमेंट ( जीथब पर कोड देखें और ReadTheDocs पर परिणाम देखें ):

mytoolbox
|-- mypackage
|   |-- __init__.py
|   |-- foo.py
|   |-- mysubpackage
|       |-- __init__.py
|       |-- bar.py
|-- doc
|   |-- source
|       |--index.rst
|       |--conf.py
|       |-- _templates
|           |-- custom-module-template.rst
|           |-- custom-class-template.rst

conf.py:

import os
import sys
sys.path.insert(0, os.path.abspath('../..'))  # Source code dir relative to this file

extensions = [
    'sphinx.ext.autodoc',  # Core library for html generation from docstrings
    'sphinx.ext.autosummary',  # Create neat summary tables
]
autosummary_generate = True  # Turn on sphinx.ext.autosummary

# Add any paths that contain templates here, relative to this directory.
templates_path = ['_templates']

index.rst(नया :recursive:विकल्प नोट करें ):

Welcome to My Toolbox
=====================

Some words.

.. autosummary::
   :toctree: _autosummary
   :template: custom-module-template.rst
   :recursive:

   mypackage

यह पैकेज में प्रत्येक मॉड्यूल को स्वचालित रूप से सारांशित करने के लिए पर्याप्त है, हालांकि गहराई से नेस्टेड है। प्रत्येक मॉड्यूल के लिए, यह उस मॉड्यूल में प्रत्येक विशेषता, फ़ंक्शन, वर्ग और अपवाद को संक्षेप में प्रस्तुत करता है।

अजीब तरह से, हालांकि, डिफ़ॉल्ट sphinx.ext.autosummaryटेम्प्लेट प्रत्येक विशेषता, फ़ंक्शन, वर्ग और अपवाद के लिए अलग-अलग प्रलेखन पृष्ठ बनाने के लिए नहीं जाते हैं, और सारांश तालिकाओं से उन्हें लिंक करते हैं। ऐसा करने के लिए टेम्प्लेट का विस्तार करना संभव है, जैसा कि नीचे दिखाया गया है, लेकिन मैं यह नहीं समझ सकता कि यह डिफ़ॉल्ट व्यवहार क्यों नहीं है - निश्चित रूप से यही सबसे अधिक लोग चाहते हैं ..? मैंने इसे एक सुविधा अनुरोध के रूप में उठाया है

मुझे डिफ़ॉल्ट टेम्प्लेट को स्थानीय रूप से कॉपी करना था, और फिर उन्हें जोड़ना था:

  • को कॉपी site-packages/sphinx/ext/autosummary/templates/autosummary/module.rstकरेंmytoolbox/doc/source/_templates/custom-module-template.rst
  • को कॉपी site-packages/sphinx/ext/autosummary/templates/autosummary/class.rstकरेंmytoolbox/doc/source/_templates/custom-class-template.rst

में हुक custom-module-template.rstमें है index.rstका उपयोग करते हुए, इसके बाद के संस्करण :template:विकल्प। (डिफ़ॉल्ट साइट-संकुल टेम्प्लेट का उपयोग करके क्या होता है यह देखने के लिए उस पंक्ति को हटा दें।)

custom-module-template.rst (दाईं ओर दी गई अतिरिक्त लाइनें):

{{ fullname | escape | underline}}

.. automodule:: {{ fullname }}
  
   {% block attributes %}
   {% if attributes %}
   .. rubric:: Module Attributes

   .. autosummary::
      :toctree:                                          <-- add this line
   {% for item in attributes %}
      {{ item }}
   {%- endfor %}
   {% endif %}
   {% endblock %}

   {% block functions %}
   {% if functions %}
   .. rubric:: {{ _('Functions') }}

   .. autosummary::
      :toctree:                                          <-- add this line
   {% for item in functions %}
      {{ item }}
   {%- endfor %}
   {% endif %}
   {% endblock %}

   {% block classes %}
   {% if classes %}
   .. rubric:: {{ _('Classes') }}

   .. autosummary::
      :toctree:                                          <-- add this line
      :template: custom-class-template.rst               <-- add this line
   {% for item in classes %}
      {{ item }}
   {%- endfor %}
   {% endif %}
   {% endblock %}

   {% block exceptions %}
   {% if exceptions %}
   .. rubric:: {{ _('Exceptions') }}

   .. autosummary::
      :toctree:                                          <-- add this line
   {% for item in exceptions %}
      {{ item }}
   {%- endfor %}
   {% endif %}
   {% endblock %}

{% block modules %}
{% if modules %}
.. rubric:: Modules

.. autosummary::
   :toctree:
   :template: custom-module-template.rst                 <-- add this line
   :recursive:
{% for item in modules %}
   {{ item }}
{%- endfor %}
{% endif %}
{% endblock %}

custom-class-template.rst (दाईं ओर दी गई अतिरिक्त लाइनें):

{{ fullname | escape | underline}}

.. currentmodule:: {{ module }}

.. autoclass:: {{ objname }}
   :members:                                    <-- add at least this line
   :show-inheritance:                           <-- plus I want to show inheritance...
   :inherited-members:                          <-- ...and inherited members too

   {% block methods %}
   .. automethod:: __init__

   {% if methods %}
   .. rubric:: {{ _('Methods') }}

   .. autosummary::
   {% for item in methods %}
      ~{{ name }}.{{ item }}
   {%- endfor %}
   {% endif %}
   {% endblock %}

   {% block attributes %}
   {% if attributes %}
   .. rubric:: {{ _('Attributes') }}

   .. autosummary::
   {% for item in attributes %}
      ~{{ name }}.{{ item }}
   {%- endfor %}
   {% endif %}
   {% endblock %}

6

स्फिंक्स ऑटोएपीआई बिल्कुल यही करता है।


1
हे भगवान! यह किसी भी चीज़ से बहुत बेहतर काम करता है। ध्यान दें कि यह "ऑटोडोक" या "एपीडॉक" नहीं है, यह पूरी तरह से अलग विस्तार है।
रोपेलडर

2
डिट्टो। यह "ऑटो" को "ऑटोडोक" में डालता है .... यहां हमारी सभी परियोजना को स्विच करना है: ऑटोडोक से ऑटोप्सी पर स्विच करें nealmcb द्वारा · अनुरोध अनुरोध करें # 7 · gwexploratoryaudits / r2b2
nealmcb

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.