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

时间:2017-03-08 21:54:48

标签: python packages setuptools setup.py

我使用setup.py创建一个包foo,然后在pip install .本地安装在一个新的虚拟环境(python 2.7)中。在虚拟env的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导入栏,这不仅可以解决问题,还可以修复上述错误并进一步调用foo.bar返回bar模块,但这不是&# 39;对我来说非常有用。

我需要做什么才能获得

>>> import foo
>>> foo.bar

正常工作?

1 个答案:

答案 0 :(得分:1)

事实证明我并不了解Python __init.__.py包的导入是如何工作的。我认为在导入顶级bar包时导入了包的所有底层子模块(如foo),但这是不真实的。 Python不会故意导入子模块,以防止加载我可能不会使用的东西,特别是在大包中。

如果我想做类似的事情:

>>> import foo
>>> foo.bar

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

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