如何在Python中使用顶级路径导入?
我正在开发一个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
文件。
这是因为导入模块的顺序问题。
- 当前目录
- 当前包
- 全局包文件夹
所以,如果你在 config.py 里尝试 import myapp.lib.some_module
,解释器会先看到你在同一个文件夹里有 myapp.py,然后它会试着从这个文件里导入 lib.some_module
,但这个文件里并没有这个模块。
这就像是你想从外部模块导入 myapp.myapp.lib.some_module
一样。
所以,最好的办法就是把 myapp.py
文件改个名字。