You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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目录(folder2folder1project),所以对应的相对导入代码应该是:

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

火山引擎 最新活动