如何在Python中使用顶级路径导入?

4 投票
1 回答
2556 浏览
提问于 2025-04-16 18:01

我正在开发一个Python框架,想要根据顶层包(也就是项目名称)来进行导入。用户会通过复制整个框架,然后在里面写自己的模块来使用这个框架。

我现在的结构是这样的:

myapp/
  config.py
  docs/
  framework/
    main.py
    utils.py
  file.py
  lib/
    some_module.py
  unit_tests/
    test_utils.py

我希望在lib和unit_tests中的Python文件里能够这样使用导入:

from myapp.framework import utils

有没有简单的方法可以做到这一点?我试过用sys.path.append()的方法,但效果不是很好。如果有更符合Python风格的方法来实现这个,我愿意多花点时间去搞定它。

补充:我又试了一次sys.path.append(),结果真的有效了,但这个方法看起来不太优雅,我很想知道有没有其他的解决办法。

1 个回答

2

简单来说:你不能在一个模块里面再放一个同名的模块。你有一个 myapp 文件夹和一个 myapp.py 文件。

这是因为导入模块的顺序问题。

  1. 当前目录
  2. 当前包
  3. 全局包文件夹

所以,如果你在 config.py 里尝试 import myapp.lib.some_module,解释器会先看到你在同一个文件夹里有 myapp.py,然后它会试着从这个文件里导入 lib.some_module,但这个文件里并没有这个模块。

这就像是你想从外部模块导入 myapp.myapp.lib.some_module 一样。

所以,最好的办法就是把 myapp.py 文件改个名字。

撰写回答