【问题标题】:Managing imports within a package管理包中的导入
【发布时间】:2021-12-08 12:55:38
【问题描述】:

我很困惑如何最好地管理 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 错误。

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

【问题讨论】:

    标签: python python-import python-module python-packaging


    【解决方案1】:

    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.]

    【讨论】:

    • 哦有趣,我刚想试试from .__init__ import *,但这也导致了错误,因为后来__init__.py 中的from .bar export bar_fn 代码,显然。你的工作,当然。不过,我真的不明白为什么。这是否记录在某处?
    • 老实说,我不知道为什么我的工作和其他方式不工作。我已经遇到过几次这个问题,并且无法弄清楚如何正确处理它。我没有找到太多好的文档,一些随机网站中有一些例子对我有很大帮助。还有官方文档docs.python.org/3/tutorial/modules.html(转6.4 Packages)
    猜你喜欢
    • 2017-01-29
    • 2016-10-12
    • 2017-12-14
    • 1970-01-01
    • 1970-01-01
    • 2017-05-23
    • 1970-01-01
    • 1970-01-01
    • 2017-11-28
    相关资源
    最近更新 更多