跨目录导入自定义Enum类报错ModuleNotFoundError: No module named 'enums'的解决咨询
嘿,我之前也踩过这个跨目录导入的坑,本质上是Python的模块搜索路径没包含到你的enums目录导致的,结合你的目录结构,给你几个实用的解决办法:
先再明确下你的目录结构,方便大家对照:
- 项目根目录 - enums -- __init__.py -- flavors.py - setUp -- test.py
方法一:手动添加项目根目录到Python搜索路径(最常用灵活)
在test.py的最开头加上这段代码,把项目根目录添加到Python的模块搜索路径里,这样Python就能找到enums模块了:
import sys import os # 获取当前test.py文件的绝对路径,再往上退两级到项目根目录 project_root = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) sys.path.append(project_root) # 现在就能正常导入了 from enums.flavors import Flavor
解释下:os.path.abspath(__file__)会拿到test.py的完整路径,两次dirname就跳到了包含enums和setUp的根目录,把这个路径加到sys.path后,Python就会去这里找模块了。
方法二:使用相对导入(适合把项目当作包运行的场景)
如果你习惯用模块方式运行脚本,可以用Python的相对导入语法,在test.py里这么写:
from ..enums.flavors import Flavor
⚠️ 注意:这种方式不能直接运行test.py(比如直接敲python setUp/test.py会报错ValueError: attempted relative import in non-package),必须从项目根目录用模块命令运行:
python -m setUp.test
这样Python会把整个项目当作一个包来处理,相对导入就能生效了。
方法三:把enums安装成可编辑包(适合大型项目)
如果你的项目规模比较大,后续经常要跨目录导入enums里的内容,可以把它打包成可编辑的Python包,这样全局都能直接导入:
- 在项目根目录创建一个
setup.py文件,内容如下:
from setuptools import setup, find_packages setup( name="my_flavor_enums", packages=find_packages(), version="0.1.0", )
- 在项目根目录运行这条命令,把包以可编辑模式安装:
pip install -e .
之后不管你在哪个脚本里,直接写from enums.flavors import Flavor就能成功导入了,而且你对enums文件夹里的代码修改会实时生效,不用重新安装。
额外小优化:简化导入路径
如果你想让导入更简洁,可以在enums/__init__.py里加上一行:
from .flavors import Flavor
这样之后导入的时候就可以直接写:
from enums import Flavor
不用再写长长的enums.flavors啦~
备注:内容来源于stack exchange,提问作者camel

