สฟิงซ์สามารถเชื่อมโยงไปยังเอกสารที่ไม่อยู่ในไดเร็กทอรีด้านล่างของเอกสารรูทได้หรือไม่?


91

ฉันใช้ Sphinx เพื่อจัดทำเอกสารโครงการที่ไม่ใช่ Python ฉันต้องการกระจาย./docโฟลเดอร์ในแต่ละโมดูลย่อยที่มีsubmodule_name.rstไฟล์เพื่อจัดทำเอกสารโมดูลนั้น จากนั้นฉันต้องการดูดไฟล์เหล่านั้นลงในลำดับชั้นหลักเพื่อสร้างข้อมูลจำเพาะสำหรับการออกแบบทั้งหมด

ได้แก่ :

Project
  docs
    spec
      project_spec.rst
      conf.py
  modules
    module1
      docs
        module1.rst
      src
    module2
      docs
        module2.rst
      src

ฉันพยายามรวมไฟล์ในโททรีproject_spec.rstเอกสารหลักดังนี้:

.. toctree::
   :numbered:
   :maxdepth: 2

   Module 1 <../../modules/module1/docs/module1>

อย่างไรก็ตามผลลัพธ์ของข้อความแสดงข้อผิดพลาดนี้:

คำเตือน: toctree มีการอ้างอิงถึงเอกสารที่ไม่มีอยู่ u'modules / module1 / docs / module1 '

ไม่สามารถใช้../ในเส้นทางเอกสารได้หรือไม่?

อัปเดต: เพิ่มตำแหน่ง conf.py

อัปเดต: นอกเหนือจากเคล็ดลับรวมด้านล่างนี้ยังเป็นไปไม่ได้ (2019) มีปัญหาที่เปิดอยู่ซึ่งได้รับการผลักดันไปข้างหน้า: https://github.com/sphinx-doc/sphinx/issues/701


ต้องเพิ่ม.rstนามสกุลในไลน์Module 1 <../../modules/module1/docs/module1>ไหม
คริส

ฉันไม่คิดอย่างนั้นเพราะในSphinx Docs : เนื่องจากไฟล์ซอร์ส reST อาจมีนามสกุลที่แตกต่างกัน (บางคนชอบ. txt, บางคนชอบ. rst - ส่วนขยายสามารถกำหนดค่าด้วย source_suffix) และระบบปฏิบัติการที่แตกต่างกันมีตัวคั่นพา ธ ต่างกัน Sphinx เป็นนามธรรม: "ชื่อเอกสาร" ทั้งหมดสัมพันธ์กับไดเร็กทอรีต้นทางส่วนขยายจะถูกถอดออกและตัวคั่นเส้นทางจะถูกแปลงเป็นเครื่องหมายทับ
mc_electron

ตกลงแค่เดา! ดังนั้นฉันคิดว่าsource_suffixมันถูกตั้งค่า.rstในconf.pyไฟล์กำหนดค่าของคุณ นอกจากนี้ไฟล์นี้อยู่ที่ไหนในลำดับชั้นไดเร็กทอรีของคุณเนื่องจากดูเหมือนว่าเส้นทางทั้งหมดจะสัมพันธ์กับไฟล์นี้
คริส

ใช่source_suffixตั้งค่าเป็น.rstและconf.pyอยู่ในโฟลเดอร์เดียวกับproject_spec.rstไฟล์
mc_electron

คำตอบ:


109

ใช่คุณสามารถ!

แทน symlink (ซึ่งใช้ไม่ได้กับ Windows) ให้สร้างเอกสาร Stub ที่ไม่มีอะไรเลยนอกจาก.. include::คำสั่ง

ฉันพบสิ่งนี้โดยพยายามเชื่อมโยงไปยังไฟล์ README ที่อยู่ด้านบนสุดของแผนผังซอร์ส ฉันใส่สิ่งต่อไปนี้ในไฟล์ชื่อreadme_link.rst:

.. include:: ../README

จากนั้นindex.rstฉันทำให้ toctree ดูเหมือน:

Contents:

.. toctree::
   :maxdepth: 2

   readme_link
   other_stuff

และตอนนี้ฉันมีลิงก์ไปยังบันทึกประจำรุ่นของฉันในหน้าดัชนีของฉัน

ขอบคุณhttp://reinout.vanrees.org/weblog/2010/12/08/include-external-in-sphinx.htmlสำหรับข้อเสนอแนะ


6
README มีอิมเมจหรือสิ่งที่คล้ายกันที่มีพา ธ สัมพัทธ์ที่ไม่ถูกต้องภายในไดเร็กทอรี index.rst อยู่คุณจะจัดการกับมันอย่างไร? ฉันได้รับข้อผิดพลาด 'ไฟล์ภาพไม่สามารถอ่านได้'
Lucas W

ใช่คุณสามารถทำได้ใน Unix ด้วย symlinks คุณสามารถสร้างลิงค์ที่มีชื่อเดียวกับ docs-folder (เช่นdocs) ที่ลิงก์ไปยัง current-dir ('.') จากนั้นคุณสามารถใช้: ดาวน์โหลด: docs\foo.rstและสิ่งนี้จะใช้ได้กับไฟล์ในdocsโฟลเดอร์หรือในโฟลเดอร์หลัก
ankostis

1
ฉันเพิ่งกลับมาที่นี่และยอมรับคำตอบนี้ขอบคุณ! ไม่แน่ใจเกี่ยวกับภาพ แต่คุณสามารถคัดลอกใน conf.py ได้ตลอดเวลา
mc_electron

11
ฉันจำเป็นต้องใช้.. include:: ../readme.rstรวมถึงส่วนขยาย
nu everest

1
รวมเฉพาะบางส่วนของ README.rst: muffinresearch.co.uk/…
ederag

14

ดูเหมือนว่าคำตอบคือไม่เอกสารที่อยู่ใน toc-tree จะต้องอยู่ในไดเร็กทอรีต้นทางนั่นคือไดเร็กทอรีที่มีเอกสารหลักของคุณและconf.py(และไดเร็กทอรีย่อยใด ๆ )

จากรายชื่อผู้รับจดหมาย sphinx-dev :

ที่ STScI เราเขียนเอกสารสำหรับแต่ละโครงการใน Sphinx จากนั้นก็จัดทำ "เอกสารหลัก" ซึ่งรวมถึง (ใช้ toctree) เอกสารเฉพาะโครงการอื่น ๆ อีกจำนวนหนึ่ง ในการทำเช่นนี้เราจะสร้าง symlinks ในไดเร็กทอรีต้นทาง doc ของเอกสารหลักไปยังไดเร็กทอรีต้นทาง doc ของโปรเจ็กต์เนื่องจาก toctree ดูเหมือนจะไม่ต้องการรวมไฟล์นอกแผนผังซอร์สของ doc

ดังนั้นแทนที่จะคัดลอกไฟล์โดยใช้shutilคุณสามารถลองเพิ่ม symlink ให้กับโมดูลทั้งหมดของคุณในProject/docs/specไดเร็กทอรี หากคุณสร้าง symlink ให้Project/modulesคุณจะอ้างอิงไฟล์เหล่านี้ใน toc-tree ของคุณเช่นเดียวกับmodules/module1/docs/module1อื่น ๆ


3
มันแย่เกินไป ข้อดีอย่างหนึ่งที่ฉันเห็นในการพยายามเปลี่ยนจากเอกสาร Word เป็น Sphinx คือคุณสามารถนำเข้าโมดูลฮาร์ดแวร์ที่ใช้ซ้ำได้ในโครงการของคุณและเพียงแค่รวมเอกสารไว้ในเอกสารหลักสำหรับการออกแบบ ฉันจะใช้ symlinks แต่อนิจจาฉันอยู่บน windows
mc_electron

สำหรับคนรุ่นหลังฉันลองเพิ่มโฟลเดอร์sys.pathsubodule doc ไปยังใน conf.py แต่ก็ไม่ได้ผล
mc_electron

1
@mc_electron สำหรับ symlink บน Windows ให้ใช้คำสั่ง mklink
Jeremy

12

ใน conf.py เพิ่มพา ธ สัมพัทธ์ไปยังระบบโดยใช้ sys.path และ os.path

ตัวอย่างเช่น:

import os
import sys

sys.path.insert(0, os.path.abspath('..'))
sys.path.insert(0, os.path.abspath('../../Directory1'))
sys.path.insert(0, os.path.abspath('../../Directory2'))

จากนั้นใช้ index.rst ของคุณตามปกติโดยอ้างอิงไฟล์ rst ในไดเร็กทอรีเดียวกัน ดังนั้นใน index.rst ของฉันในโฟลเดอร์ Sphinx ในเครื่องของฉัน:

Contents:

.. toctree::
   :maxdepth: 4

   Package1 <package1.rst>
   Package2 <package2.rst>
   Package3 <package3.rst>

จากนั้นใน package1.rst คุณควรจะอ้างอิงแพ็คเกจสัมพัทธ์ได้ตามปกติ

Package1 package
=====================

Submodules
----------

Submodule1 module
----------------------------------

.. automodule:: file_within_directory_1
    :members:
    :undoc-members:
    :show-inheritance:

Submodule1 module
----------------------------------

.. automodule:: file_within_directory_2
    :members:
    :undoc-members:
    :show-inheritance:

พฤติกรรมใหม่นี้หรือไม่? เพิ่มในเวอร์ชันอะไร
mc_electron

2
จะดีมากถ้าอธิบายเพิ่มเติมเพื่อแจ้งผู้เริ่มต้น ตัวอย่างเช่น What is Package1? มีการpathระบุครั้งแรกโดยใช้sys.path.insert? หรือมีการสอนที่ไหนสักแห่ง? ฉันไม่พบเอกสารที่เกี่ยวข้อง
Manavalan Gajapathy

Package1เป็นรายการที่มีชื่อเพื่อให้ TOC แสดง "Package1" เป็นชื่อของส่วน
PabloC

3
สิ่งนี้ช่วยให้คุณสามารถ autodoc Python โมดูลในไดเร็กทอรีอื่น แต่ไม่อนุญาตให้คุณรวมไฟล์ RST ไว้ในไดเร็กทอรีอื่น
mc_electron

1

นอกจากนี้ยังสามารถกำหนดค่าสฟิงซ์ให้มีเฉพาะไฟล์ index.rst ในรูทและเนื้อหาสฟิงซ์อื่น ๆ ทั้งหมดใน Project / docs:

สำหรับ windows ฉันย้ายไฟล์สฟิงซ์และ dirs ทั้งหมด (ยกเว้น index.rst) ไปยัง docs / และเปลี่ยน:

docs/make.bat: เปลี่ยน

set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS%  .

ถึง

set ALLSPHINXOPTS=-d %BUILDDIR%/doctrees %SPHINXOPTS%  -c . ..

docs/conf.py: เพิ่ม

sys.path.insert(0, os.path.abspath('..'))

ขอบคุณ! การกำหนดค่านั้นใช้งานได้ดีสำหรับฉันเมื่อมีแพ็กเกจที่เกี่ยวข้องหลายแพ็กเกจในที่เก็บเดียวโดยอ้างอิงจากเอกสารประกอบเดียวกัน
Gregor Müllegger

1

ฉันแก้ไขปัญหาที่ค่อนข้างคล้ายกันของฉันด้วยความแตกต่างที่ฉันต้องการรวมสมุดบันทึก jupyter ภายนอก ฉันติดตั้ง nbsphinx แล้ว แต่ไม่สามารถใช้งานได้ อะไรไม่ได้ผล:

  1. ฉันมีไดเร็กทอรีที่ฉันต้องการรวมรูทในพา ธ :

    conf.py:

    import os import sys sys.path.insert(...

  2. การใช้.. include:: directiveไฟล์นั้นรวมอยู่ในเอกสาร แต่ตามที่เป็นอยู่

ในที่สุดสิ่งที่แก้ปัญหาได้คือการติดตั้งแพ็คเกจnbsphinx-link


0

วิธีแก้ปัญหาหนึ่งหากเป็นไปไม่ได้จริงๆที่จะใช้ลิงก์สัมพัทธ์ที่สำรองไว้../คือฉันสามารถใช้shutilเพื่อคัดลอกไฟล์ลงในโครงสร้างโฟลเดอร์ข้อมูลจำเพาะในconf.pyข้อมูลจำเพาะได้ แต่ฉันไม่อยากมีสำเนาหลายชุดเว้นแต่จำเป็นจริงๆ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.