2017-03-08 7 views
1

ich setup.py bin mit einem Paket foo zu erstellen und es dann mit pip install . in einem frischen virtuellen env lokalen Installation (Python 2.7). Im Python-Interpreter des virtuellen Env bin ich in der Lage, foo zu importieren, aber Python scheint zu denken, foo ist mehr ein Modul als ein Python-Paket (die Paketart mit der Datei __init__.py), weil, wenn ich versuche, 's Unterstruktur aufzurufen, es gibt mir einen Fehler über das Modul, das das bar Attribut nicht hat.Python denkt, dass meine setup.py Paket erstellt ist ein Modul, kein Python-Paket

Zum Beispiel kann ich foo ohne Probleme importieren, aber wenn ich versuche, und alles abblasen foo, schlägt es mit der Fehlermeldung:

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

Hier ist die Ordnerstruktur:

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

Hier ist mein setup.py Datei:

from setuptools import setup 

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

Inte Ruhig kann ich Bar mit from foo import bar importieren und das funktioniert nicht nur aber es behebt dann meinen obigen Fehler und weitere Aufrufe an foo.bar, die das bar Modul zurückgeben, aber das ist nicht sehr nützlich für mich.

Was muss ich tun, um zu bekommen

>>> import foo 
>>> foo.bar 

richtig funktioniert?

+0

Was ist der Inhalt der '__init __. Py' Datei? – jwodder

+0

Die Datei '__init __. Py' ist leer – user2859458

Antwort

1

Stellt sich heraus, ich habe nicht verstanden, wie Importe von Python __init.__.py Pakete arbeiten. Ich dachte, dass alle zugrunde liegenden Submodule eines Pakets (wie bar) importiert wurden, als ich das Top-Level foo-Paket importierte, aber das ist nicht wahr. Python importiert Submodule nicht absichtlich, um das Laden von Dingen zu verhindern, die ich nicht verwenden kann, besonders in großen Paketen.

Wenn ich so etwas tun wollte:

>>> import foo 
>>> foo.bar 

dann alles, was ich tun musste, war import bar in der __init__.py Datei des foo Modul.

Ich habe auch gelernt, dass alle Pakete Module sind, (obwohl nicht alle Module Pakete sind), deshalb ist mein Fehler beschwert, wie das Modul das Attribut nicht hatte.

+1

Sie können einen expliziten relativen Import' from verwenden. Importiere Bar' statt nur 'Importbar' in' _init___py', für Python 3-Kompatibilität. (Siehe [PEP 328] (https://www.python.org/dev/peps/pep-0328/).) – user2357112

Verwandte Themen