包导入与模块同名的函数,导致相对导入的重影

时间:2017-08-28 23:15:33

标签: python import package relative-import

我有一个像这样组织的包foo_package

foo/
    setup.py
    README.md
    ...
    foo_package/
        __init__.py
        bar.py
        baz.py

模块bar.py定义了一个' public'函数也命名为bar,模块和函数都可以从命名bar中获益匪浅。 bar.py也定义了一些私人'辅助功能。

__init__.py内部,我对bar.bar进行了顶级导入,以便foo_package.bar成为整个软件包的API。

# __init__.py:
from .bar import bar

但现在我被相对进口所困扰。

首先,如果我正在调试或在像IPython这样的交互式提示中工作,天真地粘贴from .bar import bar并不起作用。我可以通过在foo_package内启动IPython并使用from foo_package import bar来解决这个问题。

但是,我如何导入bar 模块而不是导出的bar函数?例如。

的变种
from foo_package import bar
import foo_package.bar as bar

等,所有导入函数 bar,同时bar.py也包含对另一个模块的相对导入,例如

# inside bar.py
from .baz import helper_function

然后是普通的

import bar

也不会工作。

包级别的重影'具有bar bar 模块的功能是正确的行为。如何在本地开发中导入bar 模块的同时保持这一点(特别是在像IPython这样的交互式环境中)?

1 个答案:

答案 0 :(得分:1)

如果您确实有令人信服的理由保留阴影,则可以通过sys.modules访问模块对象:

import sys
import foo_package.bar

bar_module = sys.modules['foo_package.bar']

还有importlib.import_module

import importlib

bar_module = importlib.import_module('foo_package.bar')