Python 认为我 setup.py 创建的包是一个模块而不是 python 包

Python thinks my setup.py created package is a module not a python package

我正在使用 setup.py 创建一个包 foo,然后在新的虚拟环境 (python 2.7) 中使用 pip install . 在本地安装它。在虚拟环境的 python 解释器中,我可以导入 foo,但是 python 似乎认为 foo 比 python 包更像是一个模块(包使用 __init__.py 文件)因为当我尝试调入 foo 的子结构时,foo.bar,它给我一个关于模块没有 bar 属性的错误。

例如,我可以毫无问题地导入 foo,但如果我尝试调用任何关闭 foo,它会失败并显示错误消息:

>>> import foo
>>> foo.bar
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'module' object has no attribute 'bar'

文件夹结构如下:

foo/
    foo/
        __init__.py
        bar.py
setup.py

这是我的 setup.py 文件:

from setuptools import setup

setup(
    url='none',
    author='loren',
    name='foo',
    version='1.0.0',
    packages=['foo'],
)

有趣的是,我可以使用 from foo import bar 导入 bar 不仅可以,而且还可以修复我的上述错误并进一步调用 foo.bar 返回 bar 模块,但是对我不是很有用。

我需要做什么才能得到

>>> import foo
>>> foo.bar

能正常工作吗?

原来我不明白 Python __init.__.py 包的导入是如何工作的。当我导入顶级 foo 包时,我认为包的所有底层子模块(如 bar)都已导入,但事实并非如此。 Python 不会故意导入子模块以防止加载我可能不会使用的东西,尤其是在大包中。

如果我想做类似的事情:

>>> import foo
>>> foo.bar

然后我需要做的就是 import barfoo 模块的 __init__.py 文件中。

我还了解到所有的包都是模块,(虽然不是所有的模块都是包)所以这就是为什么我的错误是抱怨模块没有属性。