Python项目中从tests目录导入变量时出现ImportError的原因咨询
这是个很有意思的问题——虽然从tests目录导入代码确实不符合常规开发规范,但咱们来一步步拆解为什么会出现ImportError: cannot import name 'VAR'的问题。
核心结论:不是tests目录被“机制排除”,而是导入过程中出现了冲突或缓存问题
你的项目结构和PYTHONPATH配置本身是没问题的(python_project在PYTHONPATH中,且tests目录有__init__.py,理论上是可以作为顶级模块导入的),导致报错的常见原因有这几个:
导入了错误的
tests模块
Python在导入模块时,会按照sys.path里的目录顺序查找。如果你的环境中(比如Python标准库、第三方包)存在另一个名为tests的模块,且它的路径在python_project之前,那么Python会优先导入这个外部的tests模块,而不是你项目里的。这个外部的tests模块显然没有constants.py或者VAR变量,自然会报错。你可以在
script.py里添加几行代码验证这一点:import sys print("当前sys.path顺序:", sys.path) import tests print("实际导入的tests模块路径:", tests.__file__)如果打印的路径不是你项目里的
python_project/tests/__init__.py,那就说明是命名冲突了。Python字节码缓存(.pyc)过期
如果你之前修改过tests/constants.py(比如一开始没有VAR变量,后来才添加),Python生成的.pyc字节码文件可能还保留着旧版本的内容。这时候即使你修改了源码,Python还是会加载缓存的旧文件,导致找不到VAR。解决方法很简单:找到tests目录下的
__pycache__文件夹,把它删除,然后重新运行脚本。tests目录下的
__init__.py有干扰
虽然你提到tests/__init__.py是空的,但如果里面有一些特殊代码(比如导入了其他同名模块、覆盖了变量),也可能影响导入。你可以暂时把tests/__init__.py重命名(比如改成__init__.bak),再尝试导入,看看问题是否解决。
额外说明:为什么不建议从tests目录导入代码?
虽然技术上可以做到,但tests目录的设计初衷是存放测试用例,不是应用代码的依赖。很多测试工具(比如pytest)会调整导入路径来方便测试,但这些调整是临时的,不适合在生产代码中依赖。而且从tests导入容易导致循环依赖、代码耦合等问题,所以还是尽量避免这种操作。
内容的提问来源于stack exchange,提问作者Alexey Abramov

