我使用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
正常工作?
答案 0 :(得分:1)
事实证明我并不了解Python __init.__.py
包的导入是如何工作的。我认为在导入顶级bar
包时导入了包的所有底层子模块(如foo
),但这是不真实的。 Python不会故意导入子模块,以防止加载我可能不会使用的东西,特别是在大包中。
如果我想做类似的事情:
>>> import foo
>>> foo.bar
然后我需要做的就是import bar
模块的__init__.py
文件中的foo
。
我还了解到所有软件包都是模块,(虽然不是所有模块都是软件包),这就是为什么我的错误是抱怨模块没有属性的原因。