126

我正在尝试开始使用 Sphinx,但似乎遇到了无情的问题。

命令:docs/sphinx-quickstart

我回答了所有问题,一切正常。

命令:docs/ls

一切看起来都很正常。结果:build Makefile source

命令:sphinx-build -d build/doctrees source build/html

它似乎工作。我能够打开 index.html 文件并看到我想要的“外壳”。

当我尝试将我的实际源代码作为source文件夹时,我遇到了问题。

命令:sphinx-build -d build/doctrees ../ys_utils build/html

结果:

Making output directory...
Running Sphinx v1.1.3
loading pickled environment... not yet created
No builder selected, using default: html
loading intersphinx inventory from http://docs.python.org/objects.inv...
building [html]: targets for 1 source files that are out of date
updating environment: 1 added, 0 changed, 0 removed
Traceback (most recent call last):                                                                                               
  File "/usr/local/lib/python2.6/dist-packages/Sphinx-1.1.3-py2.6.egg/sphinx/ext/autodoc.py", line 321, in import_object
    __import__(self.modname)
ImportError: No module named ys_utils
Traceback (most recent call last):
  File "/usr/local/lib/python2.6/dist-packages/Sphinx-1.1.3-py2.6.egg/sphinx/ext/autodoc.py", line 321, in import_object
    __import__(self.modname)
ImportError: No module named ys_utils.test_validate_ut
Traceback (most recent call last):
  File "/usr/local/lib/python2.6/dist-packages/Sphinx-1.1.3-py2.6.egg/sphinx/ext/autodoc.py", line 321, in import_object
    __import__(self.modname)
ImportError: No module named ys_utils.git_utils
Traceback (most recent call last):
  File "/usr/local/lib/python2.6/dist-packages/Sphinx-1.1.3-py2.6.egg/sphinx/ext/autodoc.py", line 321, in import_object
    __import__(self.modname)
ImportError: No module named setup.setup

/home/ricomoss/workspace/nextgen/ys_utils/ys_utils.rst:4: WARNING: autodoc can't import/find module 'ys_utils', it reported error: "No module named ys_utils", please check your spelling and sys.path
/home/ricomoss/workspace/nextgen/ys_utils/ys_utils.rst:10: WARNING: autodoc can't import/find module 'ys_utils.test_validate_ut', it reported error: "No module named ys_utils.test_validate_ut", please check your spelling and sys.path
/home/ricomoss/workspace/nextgen/ys_utils/ys_utils.rst:12: WARNING: don't know which module to import for autodocumenting u'UnitTests' (try placing a "module" or "currentmodule" directive in the document, or giving an explicit module name)
/home/ricomoss/workspace/nextgen/ys_utils/ys_utils.rst:18: WARNING: autodoc can't import/find module 'ys_utils.git_utils', it reported error: "No module named ys_utils.git_utils", please check your spelling and sys.path
/home/ricomoss/workspace/nextgen/ys_utils/ys_utils.rst:24: WARNING: autodoc can't import/find module 'setup.setup', it reported error: "No module named setup.setup", please check your spelling and sys.path
WARNING: master file /home/ricomoss/workspace/nextgen/ys_utils/index.rst not found
looking for now-outdated files... none found
pickling environment... done
checking consistency... /home/ricomoss/workspace/nextgen/ys_utils/ys_utils.rst:: WARNING: document isn't included in any toctree
done
preparing documents... done
writing output... [ 50%] index                                                                                                   
Exception occurred:
  File "/usr/local/lib/python2.6/dist-packages/Sphinx-1.1.3-py2.6.egg/sphinx/environment.py", line 1213, in get_doctree
    f = open(doctree_filename, 'rb')
IOError: [Errno 2] No such file or directory: '/home/ricomoss/workspace/nextgen/docs/build/doctrees/index.doctree'
The full traceback has been saved in /tmp/sphinx-err-jjJ7gM.log, if you want to report the issue to the developers.
Please also report this if it was a user error, so that a better error message can be provided next time.
Either send bugs to the mailing list at <http://groups.google.com/group/sphinx-dev/>,
or report them in the tracker at <http://bitbucket.org/birkenfeld/sphinx/issues/>. Thanks!

我是 Sphinx 的新手,对这类文档也比较陌生。任何人都可以提供一些建议吗?

编辑:

我希望能够使用 Makefile 来处理这个问题。截至目前,我的项目中有两个文件夹。

nextgen/ls

docs ys_utils

我需要为我将拥有nextgen/docs/Makefile的所有其他模块生成 HTML 。ys_utils

4

9 回答 9

108

Autodoc 找不到您的模块,因为它们不在sys.path.

您必须sys.pathconf.py. 看看你的顶部conf.py(就在 import 之后sys),有一个sys.path.insert()声明,你可以适应它。

顺便说一句:您可以使用MakefileSphinx 创建的文档来创建您的文档。打电话

make

查看选项。

如果在尝试之前出现问题:

make clean

在运行之前make html

于 2012-04-27T13:59:15.013 回答
84

解决方案

听起来os.path.append()对人们来说工作正常,但是如果您遵循conf.py模板,您会将模块路径插入到sys.pathusing的前面os.path.insert(0, ...),然后添加一个额外的.

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

如果您已将sphinx项目设置为使用单独的目录buildsource目录,则该调用应改为:

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

关于 sys.path ...

要运行 python 代码,python 解释器需要知道它在哪里。由于 sphinx 配置是一个 python 脚本,它的位置需要知道,这是通过sys.path使用 insert 方法将其添加到变量来完成的(请参阅模块搜索路径上的文档)。

在这种情况下添加的路径sys.path是“相对”路径,使用点指定。这是指定路径的一般方法,它允许移动代码并仍然正确指向代码库中的正确路径。

.- 当前路径conf.py

..- 的父路径conf.py

../..- 父路径的父路径等。

我使用的是 linux,所以目录是用正斜杠指定的,但是指定父目录的跨平台方法可以用pathlib.

from pathlib import Path

parent = Path(__file__).parent
parents_parent = Path(__file__).parents[1]
于 2017-07-07T22:30:59.897 回答
31

conf.py

只需将路径添加到您的项目文件夹。

sys.path.append('/home/workspace/myproj/myproj')
于 2012-09-03T10:47:36.297 回答
7

如果

  1. 在 conf.py 中正确设置了模块根路径
  2. __init__.py放置正确
  3. 第一个语法是正确的

并且您的自动文档仍然找不到模块...

可能是因为你的python环境下不满足这些模块的依赖关系。您将需要检查所有导入语句是否在模块中工作。

于 2020-03-15T05:35:24.387 回答
3

我不知道为什么(也许在我的情况下 autodoc 无法安装我的包),但我总是遇到module-not-found错误,直到我明确地将所有包含模块的目录包含到路径中。

对于以下示例文件夹结构

project_dir
|- setup.py
|- src
|  |- __init__.py
|  |- source1.py
|  |- sub_project
|     |- __init__.py
|     |- source2.py 
|- docs
    |- conf.py
    |- source
    |  |- index.rst
    |- _build       

包括我

for x in os.walk('../../src'):
  sys.path.insert(0, x[0])

到开头conf.py这样所有涉及的目录都将被添加。

于 2020-12-03T12:02:05.963 回答
1

我想我第一次尝试将文件添加到目录树时就这样做了。我认为这是因为我遗漏了 :maxdepth 行和文件名之间的空白行。

.. Animatrix Concepts documentation master file, created by
   sphinx-quickstart on Thu Mar 22 18:06:15 2012.
   You can adapt this file completely to your liking, but it should at least
   contain the root `toctree` directive.

Welcome to Animatrix Concepts documentation!
============================================

Contents:

.. toctree::
   :maxdepth: 2

   stuff


Indices and tables
==================

* :ref:`genindex`
* :ref:`modindex`
* :ref:`search`

以上是我的 index.rst 文件。stuff.rst 与它位于同一目录中。

于 2012-04-25T22:02:40.337 回答
1

我得到了同样的错误,但它是由与其他答案中解释的完全不同的原因引起的。

我的.. automethod:: mymodule.func指令实际上应该是:

.. automethod:: mymodule::func

请参阅文档中的1.3 版中的新增部分。autoclass

于 2019-06-05T23:33:42.750 回答
0

您可以使用Pweave和 noweb 格式生成包含嵌入其中的代码输出的 rst 文档。基本上,你编写你的第一个文件,将 python 代码嵌入到标记的块中,如下所示:

<<echo=False>>=
print("some text that will appear in the rst file")
@

Pweave 将执行这些块,并将它们替换为生成的 rst 文件中的输出,然后您可以将其与 sphinx 一起使用。有关外观的更多详细信息,请参阅Pweave reST 示例

于 2015-10-08T03:52:57.500 回答
-1

线程中的许多解决方案都在正确的方向上进行了讨论。对我来说,官方文档上的命令很有帮助。

import pathlib
import sys
sys.path.insert(0, pathlib.Path(__file__).parents[2].resolve().as_posix())
于 2022-01-31T16:44:04.240 回答