Python中如何通过相对路径从祖父母文件夹导入模块?
解决从current.py导入grandparent.py的问题
嘿,先把你的目录结构再理一遍,方便咱们说清楚:
project/ ├── grandparent.py ├── folder1/ │ ├── parent.py │ └── folder2/ │ ├── sibling.py │ └── current.py
你已经搞定了同级sibling.py和上一级parent.py的相对导入,现在要拿最顶层的grandparent.py,其实问题出在两个地方:
1. 正确的相对导入语句
从current.py所在的folder2往上数,两级才能到project目录(folder2 → folder1 → project),所以对应的相对导入代码应该是:
from ...grandparent import *
你之前试的...grandparent其实是对的,但大概率是运行方式不对导致报错——这可是Python相对导入的经典坑!
2. 别直接运行current.py,要以包的方式启动
Python的相对导入是基于模块所在的包层级的,如果你直接用python current.py或者双击运行这个文件,Python会把folder2当成顶层模块目录,这时候...这种三级相对导入就会“跳过头”,触发ValueError: attempted relative import beyond top-level package错误。
正确的操作是:
- 先切换到
project目录的上级文件夹(比如你的project在/Users/xxx/下面,就进到/Users/xxx/) - 用
-m参数以模块方式启动:
python -m project.folder1.folder2.current
这样Python就会把project当作顶层包,相对导入的层级关系就完全正确了。
小提醒:给目录加个__init__.py
虽然Python 3.3+允许没有__init__.py的命名空间包,但为了兼容性(比如兼容旧版本Python)和明确性,建议在project/、folder1/、folder2/这三个目录下都新建一个空的__init__.py文件,告诉Python这些是合法的包目录。
内容的提问来源于stack exchange,提问作者lofidevops




