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

Python测试目录无__init__.py时的模块导入方法及原因咨询

解决方法与解释

首先,先修正你的测试代码并给出正确的导入方式,再逐一解答你的疑问。

一、正确的测试代码与导入方式

你的项目根目录是Python_test(包含my、test和根__init__.py的目录),只要在这个根目录下运行pytest,就可以直接使用绝对导入,无需修改sys.path或给test目录加__init__.py。

修改test/test_main.py为:

# /Python_test/test/test_main.py
from my.my_sub.tested import inc  # 这里要导入正确的函数inc,不是func
def test_answer():
    assert inc(3) == 4  # inc(3)应该返回4,不是3

然后在项目根目录(Python_test)执行命令:

pytest test/test_main.py -v

这样就能正常运行测试了。

二、疑问解答

1)为什么test目录不应添加__init__.py?

  • 测试代码不属于源码包:test目录是用于存放测试用例的,它不是项目发布的源码包的一部分。如果添加__init__.py,Python会将其识别为一个Python包,这可能导致打包工具(如setuptools)误将测试代码打包进发布包中,增加不必要的体积。
  • 避免导入混淆:把test作为包会引入相对导入的风险(比如你尝试的from ..my.main import func就触发了错误),因为Python会将test视为顶层包的一部分,无法跨越到同级的my包进行相对导入。
  • 符合社区规范:像boto3、requests等主流开源项目的测试目录都不会添加__init__.py,保持测试代码与业务源码的分离,让测试作为独立的脚本集合运行,而非包的子模块。

2)无需通过__init__.py添加路径到PYTHONPATH的导入方法

除了上面提到的在项目根目录运行pytest(最推荐的方式),还有两种可靠方法:

  • 设置PYTHONPATH环境变量
    在运行pytest前,将项目根目录添加到PYTHONPATH:

    • Linux/macOS终端:
      export PYTHONPATH=/path/to/your/Python_test
      pytest test/test_main.py -v
      
    • Windows命令提示符:
      set PYTHONPATH=C:\path\to\your\Python_test
      pytest test/test_main.py -v
      

    这样Python会自动在PYTHONPATH指定的目录中查找my包。

  • 使用pytest配置文件
    在项目根目录创建pytest.ini文件,内容如下:

    [pytest]
    pythonpath = .
    

    这个配置会告诉pytest将当前目录(根目录)加入Python的搜索路径,之后无论你在哪个目录运行pytest,都能正确导入my包。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 07:27:47