如何在子模块中正确导入父模块,同时支持独立运行与main.py调用
Python 跨模块导入问题解决方案
项目文件结构
src ├── API │ ├── API.py │ └── __init__.py ├── DataBase │ ├── CreateDB.py │ ├── DB.py │ ├── SpacyTags.py │ └── __init__.py ├── ML │ ├── FeaturePipe.py │ ├── Labeler.py │ ├── Predictor.py │ ├── Transformer.py │ ├── ModelCreator.py │ ├── ModelOptimizer.py │ └── __init__.py ├── News │ ├── CNBCSpider.py │ ├── CNBC_parse_article.py │ ├── HistNewsAPI.py │ ├── NewsListener.py │ ├── __init__.py │ └── new_article_funcs.py ├── Stock │ ├── HistStockAPI.py │ ├── ISIN.py │ ├── PortfolioListener.py │ ├── UpdateEntries.py │ └── __init__.py ├── Testing │ └── ArticleFeatureTesting.ipynb ├── Exceptions.py ├── __init__.py ├── config.py └── main.py
问题背景
此前在PyCharm中开发时,使用绝对导入(如from src.ML.Labeler import Labeler)可正常运行;迁移到树莓派后,在src/DataBase/DB.py中导入src/config.py时遇到问题:
- 尝试相对导入时触发错误:
ImportError: attempted relative import beyond top-level package - 希望同时支持运行依赖多模块的
main.py,以及单独运行子模块测试,且不想在每个文件中添加sys.path.append()代码。
解决方案
方案1:正确使用相对导入 + 模块方式运行子模块
- 修改子模块导入语句:在
DB.py中使用相对导入引用上层目录的config.py:# src/DataBase/DB.py from ..config import 你的配置变量名 # 替换为实际需要导入的内容 - 运行方式调整:
- 运行
main.py:直接执行python src/main.py(或进入src目录后执行python main.py) - 单独运行子模块:使用Python的模块运行方式,避免直接执行文件:
python -m src.DataBase.DB
src识别为顶层包,相对导入即可正常工作。 - 运行
方案2:设置PYTHONPATH环境变量
- 临时生效:在树莓派的终端中,将项目根目录(即包含
src文件夹的目录)添加到PYTHONPATH:export PYTHONPATH="/path/to/你的项目根目录:$PYTHONPATH" - 永久生效:将上述命令添加到
~/.bashrc或~/.profile文件中,重启终端后自动生效。 - 导入方式保持不变:所有模块仍可使用PyCharm中的绝对导入语法(如
from src.config import ...),无需修改代码,同时支持直接运行子模块或main.py。
方案3:可编辑安装项目(推荐)
- 创建配置文件:在项目根目录下创建
setup.py,内容如下:from setuptools import setup, find_packages setup( name="你的项目名称", version="0.1", packages=find_packages(where="src"), package_dir={"": "src"}, ) - 执行可编辑安装:
pip install -e . - 效果:项目会被Python识别为全局可导入的包,无论在哪个目录运行,都能使用绝对导入或相对导入,完全匹配PyCharm的开发环境,同时支持任意方式运行
main.py或子模块。
内容的提问来源于stack exchange,提问作者SlayercraftHD
相关产品推荐
相关产品推荐

