스핑크스는 루트 문서 아래의 디렉토리에없는 문서에 링크 할 수 있습니까?


90

비 Python 프로젝트를 문서화하기 위해 Sphinx를 사용하고 있습니다. ./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에 파일을 포함하려고했습니다 .

.. 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>합니까?
Chris

Sphinx 문서 에서 그렇게 생각하지 않습니다 . reST 소스 파일은 다른 확장자 (.txt와 같은 일부, .rst와 같은 일부 – 확장자는 source_suffix로 구성 할 수 있음)를 가질 수 있고 OS마다 경로 구분 기호가 다르기 때문에 Sphinx 모든 "문서 이름"은 소스 디렉토리에 상대적이고 확장자는 제거되며 경로 구분 기호는 슬래시로 변환됩니다.
mc_electron 2012

좋아, 그냥 추측! 따라서 구성 파일 에 source_suffix로 설정되어 있다고 가정 합니다. 또한 모든 경로가이 파일에 상대적인 것처럼 보이기 때문에이 파일은 디렉토리 계층 구조에서 어디에 있습니까? .rstconf.py
Chris

예, source_suffix가로 설정되어 .rst있으며 파일 conf.py과 동일한 폴더에 project_spec.rst있습니다.
mc_electron 2013

답변:


108

그래 넌 할수있어!

심볼릭 링크 (Windows에서는 작동하지 않음) 대신 .. include::지시문 만있는 스텁 문서를 만듭니다 .

소스 트리의 맨 위에있는 README 파일에 연결하려고 시도했습니다. 다음을 파일에 넣습니다 readme_link.rst.

.. include:: ../README

그런 다음에서 index.rsttoctree를 다음과 같이 만들었습니다.

Contents:

.. toctree::
   :maxdepth: 2

   readme_link
   other_stuff

이제 색인 페이지에 릴리스 정보에 대한 링크가 있습니다.

제안에 대해 http://reinout.vanrees.org/weblog/2010/12/08/include-external-in-sphinx.html 에 감사드립니다.


5
README에 index.rst 디렉토리 내에서 유효하지 않은 상대 경로가있는 이미지 또는 유사 항목이 있습니다. 어떻게 처리합니까? '이미지 파일을 읽을 수 없음'오류가 발생합니다.
Lucas W :

예, 심볼릭 링크를 사용하여 Unix에서도 할 수 있습니다. docscurrent-dir ( '.')에 연결 되는 문서 폴더 (예 :)와 동일한 이름으로 링크를 만들 수 있습니다 . 그런 다음 : download :를 사용할 수 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(및 모든 하위 디렉토리)를 포함하는 디렉토리 내에 있어야합니다 .

로부터 스핑크스-dev에 메일 링리스트 :

STScI에서 우리는 Sphinx의 개별 프로젝트에 대한 문서를 작성한 다음 이러한 다른 프로젝트 별 문서를 포함하는 (toctree 사용) "마스터 문서"도 생성합니다. 이를 위해 toctree는 실제로 문서 소스 트리 외부의 파일을 포함하고 싶지 않은 것처럼 보이기 때문에 마스터 문서의 문서 소스 디렉토리에 프로젝트의 문서 소스 디렉토리에 대한 심볼릭 링크를 만듭니다.

shutil따라서을 사용하여 파일을 복사하는 대신 Project/docs/spec디렉토리의 모든 모듈에 심볼릭 링크를 추가 할 수 있습니다. 심볼릭 링크를 만들면 Project/modulestoc-tree에서 이러한 파일을 간단히 참조 할 수 있습니다 modules/module1/docs/module1.


3
유감 이네요. Word 문서에서 Sphinx로 전환 할 때 내가 본 장점 중 하나는 재사용 가능한 하드웨어 모듈을 프로젝트로 가져 와서 설계를위한 마스터 문서에 포함시킬 수 있다는 것입니다. 나는 심볼릭 링크를 사용할 것이지만 아아 나는 창문에 있습니다.
mc_electron 2014

후손 sys.path을 위해 conf.py 의 에 하위 모듈 문서 폴더를 추가하려고 시도 했지만 작동하지 않았습니다.
mc_electron 2014

1
@mc_electron Windows의 심볼릭 링크의 경우 mklink 명령을 사용합니다.
Jeremy

11

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를 사용하여 동일한 디렉토리의 첫 번째 파일을 참조하십시오. 따라서 내 로컬 Sphinx 폴더의 index.rst에서 :

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
초보자에게 알리기 위해 추가로 설명하면 좋을 것입니다. 예를 들어, 무엇 Package1입니까? 먼저 path사용하여 지정 sys.path.insert합니까? 아니면 어딘가에 튜토리얼이 있습니까? 관련 문서를 찾을 수없는 것 같습니다.
Manavalan Gajapathy

Package1TOC가 섹션 제목으로 "Package1"을 표시하도록 명명 된 항목입니다.
PabloC

2
이렇게하면 다른 디렉토리에서 Python 모듈을 자동 문서화 할 수 있지만 다른 디렉토리에 RST 파일을 포함 할 수는 없습니다.
mc_electron

1

root에 index.rst 파일 만 있고 Project / docs의 다른 모든 sphinx 항목을 갖도록 sphinx를 구성 할 수도 있습니다.

Windows의 경우 모든 스핑크스 파일과 디렉토리 (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

백업하는 상대 링크를 사용하는 것이 정말 불가능한 경우 한 가지 해결책 은 파일을 사양에 대한 사양 폴더 트리에 복사하는 데 ../사용할 수 있지만 절대적으로 필요한 경우가 아니면 여러 복사본을 갖고 싶지 않은 것입니다.shutilconf.py

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.