管理包内的导入

Managing imports within a package

我对如何最好地管理以下情况感到困惑,其中 python 包中的多个模块具有相同的依赖关系。

假设我有一个包foo,其文件结构是

foo/
    __init__.py
    bar.py
    baz.py

并且 bar.pybaz.py 都需要一些其他包,例如 external_pkg,以便他们读取

# foo/bar.py
import external_pkg
def bar_fn(x):
   # do something with external_pkg

# foo/baz.py
import external_pkg
def baz_fn(x):
   # do something with external_pkg

问题:有没有办法重构包,这样我们就可以只在__init__.py中包含import external_pkg行,而不是重复写它在模块中?天真地从模块中删除 import external_pkg 并将其放入 __init__.py 会导致 NameError: name 'external_pkg' is not defined 错误。

这在上面的例子中显然不是一个大问题,但我正在尝试编写一个小包,其中包含更多模块和更多涉及的常见导入。我知道这也可能只是我的包装设计问题。我已经尝试 google 这个,但似乎无法找到正确的术语组合来获得有用的答案。

foo/__init__.py:

import numpy as np

foo/bar.py:

from . import * # or from foo import *

print(np.zeros(10))

运行(需要在 foo 目录之外才能工作):

$ python -m foo.bar

输出:

[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]