我尝试使用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
答案 0 :(得分:0)
您的问题似乎与项目的结构有关。根据{{3}}建议,您的每个文件夹中都应包含__init__.py
个文件,包括project
。 CristiFati认为这是必要的:
需要 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和相对导入有关,我建议尝试此操作(遵循此问题的初始示例):
sys.path.insert(0,os.path.abspath('../../../ src /'))
使用
sys.path.insert(0,os.path.abspath('../../../'))
.. automodule :: pre_processing.fileInfo
具有:
.. automodule :: src.pre_processing.fileInfo
注意:不必创建__init__.py文件,正如我在先前的答案中所读到的。
致谢。