2017-03-08 51 views
1

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

例如,我可以导入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 file:

from setuptools import setup 

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

Inte休息一下,我可以用from foo import bar进口吧,不仅如此,它还修复了我上面的错误,并进一步调用foo.bar返回bar模块,但这对我没有多大用处。

什么我需要做的就是

>>> import foo 
>>> foo.bar 

正常工作?

+0

'__init __。py'文件的内容是什么? – jwodder

+0

'__init __。py'文件为空 – user2859458

回答

1

原来我不明白Python __init.__.py包的进口如何工作。当我导入顶层foo软件包时,我认为所有包的子模块(如bar)都已导入,但这是不真实的。 Python不会故意导入子模块,以防止加载我可能不使用的东西,特别是在大包中。

如果我想要做这样的事情:

>>> import foo 
>>> foo.bar 

那么我需要做的__init__.py文件foo模块为import bar

我还了解到所有的软件包都是模块(尽管不是所有的模块都是软件包),所以这就是为什么我的错误是在抱怨模块没有这个属性。

+1

您可能想要使用显式相对导入'from。导入栏“而不是'__init __。py'中的'import bar',以实现Python 3的兼容性。 (请参见[PEP 328](https://www.python.org/dev/peps/pep-0328/)。) – user2357112

相关问题