从__init__.py导入REDIS遇ImportError:相对导入无已知父包
解决Python相对导入错误:
attempted relative import with no known parent package 问题场景
我的项目中有servertools.py文件,代码片段如下:
"""Server tools script""" from typing import Dict from types import FunctionType from . import REDIS # The rest of it
运行代码时触发以下错误:
Traceback (most recent call last): File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.2800.0_x64__qbz5n2kfra8p0\lib\runpy.py", line 194, in _run_module_as_main return _run_code(code, main_globals, None, File "C:\Program Files\WindowsApps\PythonSoftwareFoundation.Python.3.8_3.8.2800.0_x64__qbz5n2kfra8p0\lib\runpy.py", line 87, in _run_code exec(code, run_globals) File "C:\Users\ever\Documents\overgames\app.py", line 11, in <module> main() File "C:\Users\ever\Documents\overgames\app.py", line 7, in main import servertools as dev File "C:\Users\ever\Documents\overgames\servertools.py", line 6, in <module> from . import REDIS ImportError: attempted relative import with no known parent package
我尝试改用from overgames import REDIS,但问题依然存在。
解决方案
1. 规范项目包结构
确保项目目录符合Python包规范,必须包含__init__.py文件标记这是一个合法包:
overgames/ __init__.py app.py servertools.py # REDIS需定义在__init__.py或同级模块中
若REDIS定义在overgames/__init__.py内,直接在servertools.py中使用from overgames import REDIS即可。
2. 手动添加项目路径到Python环境
如果Python找不到overgames包,是因为它不在sys.path列表中。在app.py开头添加以下代码,将项目目录加入环境路径:
import sys from pathlib import Path # 将当前脚本的父目录(即overgames所在目录)添加到sys.path sys.path.append(str(Path(__file__).parent))
完成后from overgames import REDIS即可正常导入。
3. 以模块方式运行脚本
避免直接运行包内脚本,转到项目的父目录(比如C:\Users\ever\Documents\),用-m参数以模块形式启动:
python -m overgames.app
这种方式会让Python将overgames识别为完整包,此时servertools.py中的相对导入from . import REDIS就能正常工作。
内容的提问来源于stack exchange,提问作者Ever Keen
相关产品推荐
相关产品推荐

