You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 11:57:24