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

flo*_*iel 5 python python-import python-3.x python-sphinx

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

给定文件结构:

project
 |_ src
 |   |_ pre_processing
 |   |     |_ fileInfo.py
 |   |
 |   |_ utils
 |         |_ folder.py
 |_ test
 |      
 |_ doc
 |   |_ doc_user
 |        |_ build
 |        |_ source
 |             |_config.py
Run Code Online (Sandbox Code Playgroud)

以下配置 sys.path :

import os
import sys
sys.path.insert(0, os.path.abspath('../../../src/'))
Run Code Online (Sandbox Code Playgroud)

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

from ..utils.folder import get_files_directory
Run Code Online (Sandbox Code Playgroud)

终端错误

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
Run Code Online (Sandbox Code Playgroud)

Nat*_*nes 0

看来您的问题与您的项目结构有关。正如CristiFati__init__.py建议的那样,您的每个文件夹中都应该有文件,包括project. 软件包上的文档认为这是必要的:

需要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
Run Code Online (Sandbox Code Playgroud)

那么main.py你应该有:

from src.pre_processing import fileInfo
Run Code Online (Sandbox Code Playgroud)

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