python怎么优雅地在子模块中导入上一级的模块?

作者站长头像
站长
· 阅读数 10

文件结构是这样的:

config.py
main.py
 |---folder
      |submodule.py

main.pysubmodule.py 中,我都想使用 config.py 中配置的参数 args。于是在 main.py 中,我导入了 args

# main.py
from config import args

同时我在submodule.py中也导入了config.py中的args

# submodule.py
from ..config import args

然后就会报错:

ValueError: attempted relative import beyond top-level package

但是我同时想在 main.pysubmodule.py 中使用 config.py 中配置好的参数,网上有的回答说,可以在 submodule.py 中把上一个文件夹目录添加到系统路径,但是感觉这样的实现很不优雅:

# submodule.py
sys.path.append('..')

请问有没有更优雅一些的方法能实现这个需求?

回复
1个回答
avatar
test
2024-07-14

先看这个:python 当前路径和导包路径问题全解析

在 java、golang、rust 等等语言里面,都喜欢把代码写到 src 文件夹中

但是在 python 中,入口文件(或者称之为启动文件)必须在顶层,这个是 python 的『当前路径和导包路径』特性决定的。

python 的导包锚点,不是『执行命令的那个路径』,而是『被启动文件所在的路径』

所以,你的问题不在『导包导错了』

而是,不应该 python folder/submodule.py

submodule.py 必须在顶层,而不是在 folder 里面


『优雅地在子模块中导入上一级的模块?』,因为你用的命令是 python folder/submodule.py,所以 folder 就是顶层且是最顶层。所以不存在『上一级的模块』,你想要 import 只能 import folder 内的东西,folder 外的东西是不可访问的

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容