Sphinx có thể liên kết đến các tài liệu không nằm trong thư mục bên dưới tài liệu gốc không?


90

Tôi đang sử dụng Sphinx để ghi lại một dự án không phải Python. Tôi muốn phân phối ./doccác thư mục trong mỗi mô-đun con, chứa submodule_name.rstcác tệp để ghi lại mô-đun đó. Sau đó, tôi muốn đưa các tệp đó vào hệ thống phân cấp chính để tạo thông số kỹ thuật cho toàn bộ thiết kế.

I E:

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

Tôi đã cố gắng đưa các tệp vào bộ project_spec.rsttài liệu chính như thế này:

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

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

Tuy nhiên, thông báo lỗi này dẫn đến:

CẢNH BÁO: toctree chứa tham chiếu đến tài liệu không tồn tại u'modules / module1 / docs / module1 '

Có phải nó không thể sử dụng ../trong một đường dẫn tài liệu bằng cách nào đó không?

Cập nhật: Đã thêm địa điểm conf.py

Cập nhật: Ngoài thủ thuật bao gồm bên dưới, điều này vẫn (2019) không thể thực hiện được. Có một sự cố mở tiếp tục được đẩy lên: https://github.com/sphinx-doc/sphinx/issues/701


Bạn có cần thêm .rstphần mở rộng vào dòng Module 1 <../../modules/module1/docs/module1>không?
Chris

Tôi không nghĩ vậy vì trong Tài liệu Sphinx : Vì các tệp nguồn reST có thể có các phần mở rộng khác nhau (một số người thích .txt, một số người thích .rst - phần mở rộng có thể được định cấu hình bằng source_suffix) và các hệ điều hành khác nhau có các dấu phân cách đường dẫn khác nhau, Sphinx tóm tắt chúng: tất cả “tên tài liệu” đều liên quan đến thư mục nguồn, phần mở rộng bị loại bỏ và dấu phân cách đường dẫn được chuyển thành dấu gạch chéo.
mc_electron

OK, chỉ là phỏng đoán! Vì vậy, tôi cho rằng điều đó source_suffixđược đặt .rsttrong conf.pytệp cấu hình của bạn . Ngoài ra, tệp này nằm ở đâu trong hệ thống phân cấp thư mục của bạn, vì có vẻ như tất cả các đường dẫn đều liên quan đến tệp này?
Chris

Có, source_suffixđược đặt thành .rstconf.pynằm trong cùng thư mục với project_spec.rsttệp.
mc_electron

Câu trả lời:


108

Có, bạn có thể!

Thay cho một liên kết tượng trưng (sẽ không hoạt động trên Windows), hãy tạo một tài liệu sơ khai không có gì trong đó ngoài một .. include::chỉ thị.

Tôi đã gặp phải vấn đề này khi cố gắng liên kết đến một tệp README ở trên cùng của cây nguồn. Tôi đặt những thứ sau vào một tệp có tên readme_link.rst:

.. include:: ../README

Sau đó index.rst, tôi làm cho cây toctree trông giống như:

Contents:

.. toctree::
   :maxdepth: 2

   readme_link
   other_stuff

Và bây giờ tôi có một liên kết đến ghi chú phát hành của tôi trên trang chỉ mục của tôi.

Cảm ơn http://reinout.vanrees.org/weblog/2010/12/08/include-external-in-sphinx.html cho đề xuất


5
README có hình ảnh hoặc tương tự có đường dẫn tương đối không hợp lệ trong thư mục index.rst nằm trong đó, bạn xử lý như thế nào? Tôi gặp lỗi 'tệp hình ảnh không thể đọc được'.
Lucas W

Có, bạn cũng có thể làm điều đó trong Unix với các liên kết tượng trưng. Bạn có thể tạo một liên kết có cùng tên với docs-folder (tức là docs) liên kết đến current-dir ('.'). Sau đó, bạn có thể sử dụng: download: docs\foo.rstvà điều này sẽ hoạt động đối với các docstệp nằm trong thư mục hoặc tệp mẹ.
ankostis

1
Tôi vừa kết thúc ở đây và chấp nhận câu trả lời này, cảm ơn! Không chắc chắn về hình ảnh, nhưng bạn luôn có thể sao chép chúng trong conf.py.
mc_electron

11
Tôi cần sử dụng .. include:: ../readme.rstbao gồm cả phần mở rộng.
nu everest

1
Để chỉ bao gồm một phần của README.rst: muffinresearch.co.uk/…
ederag

14

Có vẻ như câu trả lời là không, các tài liệu được liệt kê trong toc-tree phải nằm trong thư mục nguồn , tức là thư mục chứa tài liệu chính của bạn và conf.py(và bất kỳ thư mục con nào).

Từ danh sách gửi thư sphinx-dev :

Tại STScI, chúng tôi viết tài liệu cho các dự án riêng lẻ trong Sphinx, và sau đó cũng tạo ra một "tài liệu tổng thể" bao gồm (sử dụng toctree) một số tài liệu dành riêng cho dự án này. Để thực hiện việc này, chúng tôi tạo các liên kết tượng trưng trong thư mục nguồn doc của tài liệu chính tới các thư mục nguồn doc của dự án, vì toctree thực sự dường như không muốn bao gồm các tệp bên ngoài cây nguồn doc.

Vì vậy, thay vì sao chép tệp bằng cách sử dụng, shutilbạn có thể thử thêm các liên kết tượng trưng vào tất cả các mô-đun của mình trong Project/docs/specthư mục. Nếu bạn tạo một liên kết biểu tượng cho Project/modulesbạn, thì bạn sẽ tham chiếu các tệp này trong cây tốc độ của bạn đơn giản làmodules/module1/docs/module1 v.v.


3
Thật quá tệ. Một trong những lợi thế mà tôi thấy khi cố gắng chuyển từ tài liệu Word sang Sphinx là bạn có thể nhập mô-đun phần cứng có thể tái sử dụng vào dự án của mình và chỉ cần đưa tài liệu đó vào tài liệu chính cho thiết kế. Tôi sẽ sử dụng các liên kết tượng trưng nhưng than ôi tôi đang sử dụng windows.
mc_electron

Đối với hậu thế, tôi đã thử thêm thư mục tài liệu mô-đun con sys.pathvào trong conf.py nhưng điều đó không hiệu quả.
mc_electron

1
@mc_electron Đối với các liên kết tượng trưng trên Windows, hãy sử dụng lệnh mklink.
Jeremy

11

Trong conf.py, thêm các đường dẫn tương đối vào hệ thống bằng cách sử dụng sys.path và os.path

Ví dụ:

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'))

Sau đó, sử dụng index.rst của bạn như bình thường, tham chiếu đến các tệp đầu tiên trong cùng một thư mục. Vì vậy, trong index.rst của tôi trong thư mục Sphinx cục bộ của tôi:

Contents:

.. toctree::
   :maxdepth: 4

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

Sau đó, trong package1.rst, bạn sẽ có thể chỉ tham chiếu các gói tương đối một cách bình thường.

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:

Đây có phải là hành vi mới? Nó đã được thêm vào phiên bản nào?
mc_electron

2
Sẽ rất tuyệt nếu được mô tả thêm để thông báo cho người mới bắt đầu. Ví dụ, là Package1gì? Đó là lần đầu tiên pathđược chỉ định bằng cách sử dụng sys.path.insert? Hoặc, có một hướng dẫn ở đâu đó? Tôi dường như không thể tìm thấy tài liệu liên quan.
Manavalan Gajapathy

Package1là một mục được đặt tên để TOC hiển thị "Package1" làm tiêu đề của phần.
PabloC

2
Điều này cho phép bạn tự động mã hóa các mô-đun Python trong một thư mục khác, nhưng nó không cho phép bạn đưa các tệp RST vào một thư mục khác.
mc_electron

1

Cũng có thể cấu hình sphinx để chỉ có tệp index.rst trong thư mục gốc và tất cả những thứ khác về sphinx trong Project / docs:

Đối với windows, tôi đã chuyển tất cả các tệp và dirs nhân sư (ngoại trừ index.rst) vào docs / và đã thay đổi:

docs/make.bat: Thay đổi

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

đến

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

docs/conf.py: Thêm vào

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

Cảm ơn! Cấu hình đó hoạt động tốt đối với tôi khi có nhiều gói liên quan trong một kho lưu trữ, được tham chiếu từ cùng một tài liệu.
Gregor Müllegger

1

Tôi đã giải quyết vấn đề tương tự của mình với sự khác biệt mà tôi muốn bao gồm một sổ ghi chép jupyter bên ngoài. Tôi đã cài đặt nbsphinx nhưng không thể làm cho nó hoạt động. Những gì không hoạt động:

  1. Tôi đã có thư mục mà tôi muốn đưa thư mục gốc vào đường dẫn:

    conf.py:

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

  2. Sử dụng .. include:: directivetệp đã được bao gồm trong tài liệu nhưng hiện tại.

Cuối cùng, những gì đã giải quyết vấn đề là cài đặt gói nbsphinx-link


0

Một giải pháp, nếu thực sự không thể sử dụng các liên kết tương đối sao lưu ../là tôi có thể sử dụng shutilđể sao chép các tệp vào cây thư mục spec trong conf.pyspec, nhưng tôi không muốn có nhiều bản sao trừ khi thực sự cần thiết.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.