在Sphinx-doc上出现“尝试相对导入”错误

时间:2018-05-18 14:41:28

标签: python python-3.x python-import python-sphinx

我尝试使用Sphinx-doc的自动文档。我想解决以下问题。目前,StackOverflow没有解决方案。 是由于我的项目结构还是我选择导入模块的方式?

给定文件结构:

project
 |_ src
 |   |_ pre_processing
 |   |     |_ fileInfo.py
 |   |
 |   |_ utils
 |         |_ folder.py
 |_ test
 |      
 |_ doc
 |   |_ doc_user
 |        |_ build
 |        |_ source
 |             |_config.py

在config sys.path之后:

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

我在fileInfo.py中有一些相对导入:

from ..utils.folder import get_files_directory

终端错误

WARNING: autodoc: failed to import module 'pre_processing.fileInfo'; the following exception was raised:
Traceback (most recent call last):

File "/home/florian-stage/miniconda/envs/gd/lib/python3.5/site-packages/sphinx/ext/autodoc/importer.py", line 140, in import_module
__import__(modname)

File "/home/florian-stage/Projet-2018/pg_georef_data-master/arbo propre/src/pre_processing/fileInfo.py", line 12, in <module>
from ..utils.folder import get_files_directory
ValueError: attempted relative import beyond top-level package

2 个答案:

答案 0 :(得分:0)

您的问题似乎与项目的结构有关。根据{{​​3}}建议,您的每个文件夹中都应包含__init__.py个文件,包括projectCristiFati认为这是必要的:

  

需要 init .py文件才能使Python将目录视为包含包;这样做是为了防止具有通用名称的目录(例如字符串)无意中隐藏稍后在模块搜索路径上出现的有效模块。

为了测试您的代码,您需要从某个main.py文件运行,因为导入将相对于顶级文件夹(在这种情况下为project)。以下是文件结构的外观:

project
 |  __init__.py
 |  main.py
 |_ src
 |   |  __init__.py
 |   |_ pre_processing
 |   |     |  __init__.py
 |   |     |  fileInfo.py
 |   |
 |   |_ utils
 |         |  __init__.py
 |         |  folder.py
 |_ test
 |   |  __init__.py
 |      
 |_ doc
 |   |  __init__.py
 |   |_ doc_user
 |        |  __init__.py
 |        |_ build
 |             |  __init__.py
 |        |_ source
 |             |  __init__.py
 |             |  config.py

然后在main.py你应该:

from src.pre_processing import fileInfo

现在运行main.py应该会产生无错输出。

答案 1 :(得分:0)

我知道这是一个老问题,但是,您能解决吗?

如果某人也与Sphinx和相对导入有关,我建议尝试此操作(遵循此问题的初始示例):

  1. 替换为config.py:

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

使用

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

  1. 如果您使用的是autodoc,则必须更改.rst文件,例如:

.. automodule :: pre_processing.fileInfo

具有:

.. automodule :: src.pre_processing.fileInfo

注意:不必创建__init__.py文件,正如我在先前的答案中所读到的。

致谢。