python - 在 Python 中导入模块作为包的一部分*以及*以独立工作的方式

标签 python python-import python-3.5

注意:这是 Python 3.5

给定一些项目 thing 这样:

   thing/
       top.py (imports bar)
       utils/
           __init__.py (empty)
           bar.py (imports foo; has some functions and variables)
           foo.py (has some functions and variables)

我可以在 top.py导入 utils.bar,并且在运行 top.py 时文件 bar.py 必须包含 import utils.foo 以获取 foo.py 的代码。

要直接运行 bar.pybar.py 必须有 import foo 代替(import utils.foo失败)。如果我进行了更改,则 top.py 将不再有效。

我如何运行 top.py 或 bar.py 并在 bar.py 中为这两种用例使用相同的导入结构?我觉得我缺少一些简单的步骤或结构,但也许期望 bar.py 以这种方式独立工作要求太多(缺少条件导入等)。

编辑:我已经接受了正确的答案,但如果你仍然坚持做一些扭曲,以下对我有用:

bar.py

try:
    import foo
except ImportError as err:
    from . import foo

然后您可以直接运行 bar.py(在我的例子中,当我开发 bar.py 时,我在 if __main__ block 中使用了一些实验代码文件底部)。一旦我的代码很好地集成,我将删除条件和 ma​​in 部分(因为它不打算独立运行)。

最佳答案

通常将所有入口点都放在模块之外,而不是所有导入都是相对的。 例如

thing/
    app.py
    thing/
        __init__.py
        top.py
        utils/
            __init__.py
            bar.py
            foo.py

app.py 可以看起来像

from thing import app
if __name__ == '__main__':
    app.main()

比在 top.py 中你有

from .utils import bar

在酒吧你有

from . import foo

或者

from thing.utils import foo

或者

from ..utils import foo

因此,如果您需要两个入口点,您可以让 app 为第二个入口点获取命令行参数,或者您可以创建另一个文件,例如导入 bar 的 app

关于python - 在 Python 中导入模块作为包的一部分*以及*以独立工作的方式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40456206/

相关文章:

python - PyCharm 项目文件夹 recs 的 ModuleNotFoundError 错误

Python从包中导入函数

python - BaseEventLoop.run_in_executor() 抛出 "unexpected keyword argument ' 回调'"从 Python 3.5 开始

python - 如何让 Python 只查看前后没有空格的逗号作为分隔符

python - 欧拉计划 240 : number of ways to roll dice

python - 使用 python igraph 绘制社区

python - ModuleNotFoundError 即使模块被识别

python - OSError : libtest. 所以: undefined symbol :g_tree_new

python - 使用 MingW 在 Windows 上发布 PyGObject/GTK+ 应用程序

python - 通过 Python 读取 MySQL 有时会导致警告 1292,似乎将秒解释为大于 60。