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

Python项目与Pytest测试中目录结构及模块导入问题求助

解决Python项目模块导入与Pytest目录配置问题

嘿,我刚上手第一个Python项目的时候,也被模块导入和Pytest的目录配置折腾得头大,太懂这种摸不着头脑的感觉了!结合你的情况,我给你整理一套实用的解决方案,咱们一步步来:

先明确目录结构(通用示例)

先假设你的自定义目录大概是这样的(你可以对应替换成自己的文件名):

my_project/
├── src/
│   ├── __init__.py
│   ├── main.py
│   ├── file1.py
│   ├── file2.py
│   └── context.py
└── tests/
    ├── __init__.py
    ├── test_file1.py
    └── test_file2.py

注意:每个目录下都要加__init__.py文件(空文件就行),这能让Python把目录识别为可导入的模块,兼容性更好。

一、主代码(main.py/file1.py)导入file2.py的File2类

这里有两种靠谱的导入方式:

1. 相对导入(同一模块内)

如果file1.py和file2.py在同一个src目录下,直接用相对路径导入:

# file1.py 里的代码
from .file2 import File2

# 然后就能直接用File2类了
obj = File2()

同理,main.py里导入File2也是一样的写法:from .file2 import File2。如果要导入context.py里的内容,比如from .context import 你的变量/类。

2. 绝对导入(更稳妥,避免路径混乱)

如果担心相对导入在脚本直接运行时出错(比如python src/main.py),可以先把项目根目录加入Python的路径,再用绝对导入:
在main.py开头加这段代码:

import sys
from pathlib import Path

# 获取项目根目录(my_project)的路径
project_root = Path(__file__).parent.parent
# 把根目录加入Python搜索路径
sys.path.append(str(project_root))

# 现在就能用绝对路径导入了
from src.file2 import File2
from src.context import 你的内容

二、Pytest测试文件的导入问题

测试文件要导入src里的模块,同样可以用下面几种方法:

1. 给测试文件添加路径配置

在测试文件(比如test_file1.py)开头加这段代码,手动把项目根目录加入路径:

import sys
from pathlib import Path

project_root = Path(__file__).parent.parent
sys.path.append(str(project_root))

# 然后就能导入src里的模块了
from src.file1 import 要测试的类/函数
from src.file2 import File2

2. 运行Pytest时指定Python路径

在项目根目录下执行Pytest命令时,加上--pythonpath=.参数,直接把根目录加入搜索路径:

pytest --pythonpath=. tests/

这样测试文件里就可以直接用绝对导入,不用写路径配置代码了:

# test_file1.py 里的代码
from src.file1 import 要测试的内容

3. 设置环境变量(一劳永逸)

如果你不想每次运行Pytest都加参数,可以把项目根目录加入PYTHONPATH环境变量:

  • Linux/Mac终端:
export PYTHONPATH=/path/to/your/my_project
  • Windows命令提示符:
set PYTHONPATH=C:\path\to\your\my_project

设置完后,直接在项目根目录运行pytest就行,测试文件里的绝对导入会自动生效。

三、利用你的context.py简化配置

既然你已经有了context.py,可以把路径配置逻辑放在这里,让其他文件统一导入:

# context.py 里的代码
import sys
from pathlib import Path

# 定义项目根目录
PROJECT_ROOT = Path(__file__).parent.parent
# 加入Python路径
sys.path.append(str(PROJECT_ROOT))

然后在main.py或测试文件里,只要先导入context,就能直接用绝对导入了:

# main.py 里
from .context import PROJECT_ROOT
from src.file2 import File2

# test_file1.py 里
from src.context import PROJECT_ROOT
from src.file1 import 要测试的内容

几个避坑提醒

  • 不要在直接运行的脚本(比如python main.py)顶层用相对导入,容易报ImportError,这时候用绝对导入更稳妥。
  • 运行Pytest时尽量在项目根目录下执行,路径逻辑会更清晰。
  • 避免循环导入(比如file1导入file2,file2又导入file1),如果遇到这种情况,要调整代码结构,把共用的内容抽成单独的模块。

内容的提问来源于stack exchange,提问作者Damian

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 07:10:37