Python中如何通过绝对路径导入模块(无需setup.py安装)
问题描述
项目结构
├── setup.py ├── src │ ├── __init__.py │ ├── data │ │ ├── __init__.py │ │ └── make_dataset.py │ ├── models │ ├── __init__.py └── train_model.py
各文件内容
setup.py
from setuptools import find_packages, setup setup( name="src", packages=find_packages(), version='0.1.0', description='ciao', author='Guglielmo Cerri', license='', package_dir={"": str("src")}, )
src/data/make_dataset.py
# -*- coding: utf-8 -*- def hello(): print("hi") if __name__ == '__main__': pass
src/models/train_model.py
from data.make_dataset import hello def main(): hello() if __name__ == '__main__': main()
运行错误
在src/models目录下执行python train_model.py时,触发以下错误:
Traceback (most recent call last): File "train_model.py", line 1, in <module> from data.make_dataset import prova ImportError: No module named data.make_dataset
需求
无需执行setup.py安装包,仅通过__init__.py相关配置实现from data.make_dataset import hello的绝对路径导入。
解决方案
核心是让Python识别到项目根目录(setup.py所在目录)为模块搜索路径,__init__.py只需保持空文件即可(仅用于标记目录为Python包,无需额外配置),具体实现有两种方式:
方式一:在代码中动态添加路径
在train_model.py的最顶部添加代码,将项目根目录手动加入Python的模块搜索路径:
import sys from pathlib import Path # 获取当前文件所在目录,向上两级定位到项目根目录 root_dir = Path(__file__).parent.parent.parent sys.path.append(str(root_dir))
修改后的完整train_model.py:
import sys from pathlib import Path root_dir = Path(__file__).parent.parent.parent sys.path.append(str(root_dir)) from data.make_dataset import hello def main(): hello() if __name__ == '__main__': main()
方式二:通过环境变量临时配置
运行脚本前,先设置PYTHONPATH环境变量指向项目根目录:
- Linux/macOS:
export PYTHONPATH=/你的项目根目录绝对路径 && python train_model.py - Windows(PowerShell):
$env:PYTHONPATH = "C:\你的项目根目录绝对路径"; python train_model.py
内容的提问来源于stack exchange,提问作者Will
相关产品推荐
相关产品推荐

