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

文件结构是这样的:

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.4k
1 个回答

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

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

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

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

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

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

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


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

推荐问题
宣传栏