关于Python3绝对导入的疑问:Python如何识别项目根目录?
Python本身并没有原生的“项目根目录”概念,绝对导入的查找逻辑完全基于sys.path这个路径列表——所谓的“根目录”,本质就是被添加到sys.path里的目录,Python会从这个列表里的路径开始查找要导入的模块或包。
以下是几种常见的让Python识别项目根目录的场景:
直接在项目根目录运行脚本
如果你在MyProject目录下执行python module1.py,Python会自动把当前工作目录(也就是MyProject)加入sys.path。这时候你写的import module2、from package1 import module3这类绝对导入就能正常工作。手动将根目录添加到sys.path
要是你在项目外的目录运行脚本,或者脚本嵌套在子包里面(比如package2/module4.py),可以在代码里手动把项目根目录添加到sys.path:import sys from pathlib import Path # 假设当前脚本在package2下,往上两级就是项目根目录MyProject sys.path.append(str(Path(__file__).parent.parent))这样Python就能从
MyProject开始查找导入的内容。通过包安装机制识别根目录
把MyProject做成可安装包(用setup.py或pyproject.toml配置),安装后项目会被放到Python的site-packages目录,而site-packages默认就在sys.path里。这时候不管你在哪运行代码,都能直接用绝对导入。利用PYTHONPATH环境变量
在终端里设置PYTHONPATH环境变量指向MyProject的路径:# Linux/macOS终端 export PYTHONPATH="/实际路径/MyProject" # Windows命令提示符 set PYTHONPATH=C:\实际路径\MyProject # Windows PowerShell $env:PYTHONPATH = "C:\实际路径\MyProject"Python启动时会自动把这个路径加入
sys.path,当作根目录处理。
另外补充:在Python 3.3之前,包目录必须要有__init__.py才能被识别,但3.3及之后支持命名空间包,没有__init__.py也能正常导入,不过绝对导入的核心逻辑还是围绕sys.path展开。
内容的提问来源于stack exchange,提问作者GionJh

