2017-03-08 78 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

相關問題