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

4

我是一名开发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() 的hack,但它们并不真正有效。如果有一个真正符合Python风格的方法来实现这一点,我愿意付出额外的努力让它工作。

编辑:好吧,我再次尝试使用sys.path.append(),它实际上可以工作,但它确实是一种不太优雅的解决方案,我真的很想知道是否还有其他方法。


为什么 sys.path.append() 不起作用? - ire_and_curses
@ire_and_curses - 我不确定为什么sys.path.append()无法按照我想要的方式实现所需的导入。然而,根据我的研究,似乎不建议添加到路径中。 - trinth
1
非常相似:https://dev59.com/tW025IYBdhLWcg3w4Z-u - ire_and_curses
1个回答

2
简而言之:你不能在一个模块中同时拥有两个同名的模块。你有myapp文件夹和myapp.py文件。
这是因为导入模块的顺序问题。
  1. 当前目录内
  2. 当前包
  3. 全局包文件夹
所以,如果你试图在config.py中导入myapp.lib.some_module,解释器将首先看到你在同一文件夹中有myapp.py文件,并尝试从该文件中导入lib.some_module,但该文件不存在。
这就好比试图从该模块外部导入myapp.myapp.lib.some_module
因此,最好的做法是重命名myapp.py文件。

抱歉,myapp.py文件应该只是一个占位符文件,用于展示其他文件。它实际上并不存在于框架中。我会将其从问题中删除。 - trinth

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接