Python自定义包中跨文件夹导入类失败(ModuleNotFoundError)求助
解决Python跨文件夹导入的ModuleNotFoundError(无需手动添加sys.path)
我完全理解你不想依赖sys.path.append硬编码路径的想法——这确实不是长期维护的最佳方案。下面我们一步步调整你的项目结构和运行方式,让模块导入符合Python的规范,实现自然的跨文件夹导入。
第一步:调整项目结构,符合Python包规范
Python识别一个文件夹为可导入的包,核心要求是文件夹内存在__init__.py文件(即使文件是空的也可以)。请把你的项目结构调整为如下形式:
H4Impulse/ strategies/ __init__.py # 空文件即可,标记这是一个Python包 core.py # 包含Symbol类的文件 test/ __init__.py # 测试文件夹也推荐加上,可选但更符合规范 test_symbol.py
第二步:使用正确的导入与运行方式
方式1:从项目根目录以模块形式运行测试
你之前直接运行test_symbol.py时,Python只会把脚本所在的test/目录加入sys.path,而非项目根目录,所以找不到strategies模块。
解决方法很直接:
- 打开终端,切换到你的项目根目录
H4Impulse/ - 运行以下命令执行测试:
或者更省心的(自动发现所有测试文件):python -m unittest test/test_symbol.py
用python -m unittestpython -m运行时,Python会自动把当前工作目录(项目根目录)加入sys.path,此时from strategies.core import Symbol就能正常识别模块了。
方式2:将包安装为可编辑模式(推荐长期使用)
如果希望在任何目录下都能直接导入strategies模块,或者后续要扩展包的功能,最好把项目配置为可安装的Python包。
- 在项目根目录
H4Impulse/下创建pyproject.toml文件,内容如下:[build-system] requires = ["setuptools>=61.0"] build-backend = "setuptools.build_meta" [project] name = "h4impulse" version = "0.1.0" packages = ["strategies"] # 指定要打包的模块 - 打开终端,在根目录运行:
这个命令会把你的包以「可编辑」模式安装到Python环境中——代码修改后无需重新安装就能生效。之后不管你在哪个目录运行脚本,pip install -e .from strategies.core import Symbol都能正常导入。
为什么之前的相对导入无效?
你尝试的from ..strategies.core import Symbol属于相对导入,这种导入只能在包内部使用,且必须以模块形式运行(比如python -m test.test_symbol),不能直接运行脚本文件。如果直接执行test_symbol.py,Python会把它当作独立脚本而非包的一部分,因此相对导入会触发错误。
内容的提问来源于stack exchange,提问作者Francois Paulsen
相关产品推荐
相关产品推荐

