2009-01-12 11 views
54

In einem Modul, das sich in einem Paket befindet, muss ich eine Funktion verwenden, die in der __init__.py dieses Pakets definiert ist. Wie kann ich das Paket innerhalb des Moduls importieren, das innerhalb des Pakets liegt, also kann ich diese Funktion benutzen?Python: das enthaltene Paket importieren

importiert __init__ innerhalb des Moduls wird das Paket nicht importieren, sondern ein Modul __init__ genannt, mit unterschiedlichen Namen zu zwei Kopien der Dinge führenden ...

Gibt es einen pythonic Weg, dies zu tun?

Antwort

21

Dies beantwortet nicht genau Ihre Frage, aber ich werde vorschlagen, dass Sie die Funktion außerhalb der __init__.py Datei verschieben, und in ein anderes Modul in diesem Paket. Sie können diese Funktion dann problemlos in Ihr anderes Modul importieren. Wenn Sie möchten, können Sie eine Import-Anweisung in der Datei __init__.py haben, die diese Funktion ebenfalls importiert (wenn das Paket importiert wird).

+1

ich weiß, dass ich das tun kann, es scheint nur etwas chaotisch und ähm, unpythonisch. –

+4

Nicht sicher, wie das "unpythonic" ist? Wäre die Alternative nicht noch chaotischer, da __init__.py nicht wirklich ein Modul ist? –

+15

+1 - die Verwendung eines 'common.py' in Ihrem Paket ist in Python sehr üblich. – cdleary

5

Wenn das Paket testmod und Ihre init-Datei ist daher im Paket testmod/__init__.py und Ihr Modul ist submod.py dann in der Lage benannt ist aus submod.py Datei sollten Sie nur import testmod und Verwendung zu sagen, was auch immer Sie in TestMod definiert das ist wollen.

1

Ich bin nicht ganz sicher, was die Situation ist, aber dies kann Ihr "andere Namen" Problem lösen:

import __init__ as top 
top.some_function() 

Oder vielleicht ?:

from __init__ import some_function 
some_function() 
+3

Das funktioniert, aber zumindest in cPython 2.7 der Interpreter sieht "__init__" zu sein anderes Modul als "top", und so wird die Datei "__init __. py" zweimal geladen. – dimo414

+2

Dies ist ein impliziter relativer Import, und als solcher wird in Python 3 nicht funktionieren, und ist in Python 2 sowieso eine schlechte Übung. – habnabit

+1

Dies erstellt immer noch 'sys.modules ['__ init __']'. Grundsätzlich sollte das '__init __. Py' Modul * niemals direkt importiert werden *. Importieren Sie stattdessen das Paket (den Verzeichnisnamen). –

42

Auch in Python 2.5 starten Relativimporte sind möglich. zB:

from . import foo 

von http://docs.python.org/tutorial/modules.html#intra-package-references Zitiert:


Beginnend mit Python 2.5, zusätzlich zu den impliziten relativen Einfuhren oben beschrieben, können Sie explizit relative Importe mit der Import Namen Form von Import aus Perlmoduls Erklärung. Diese expliziten relativen Importe verwenden führende Punkte, um die aktuellen und übergeordneten Pakete anzugeben, die am relativen Import beteiligt sind. Aus dem umgebenden Modul zum Beispiel, könnten Sie verwenden:

from . import echo 
from .. import formats 
from ..filters import equalizer 
+0

Dies beantwortet nicht die Frage, wie man von '__init __. Py' importiert. – BrenBarn

+1

@BrenBarn: noch ist dies der Weg, es zu importieren; Wenn Sie das * Paket * importieren, dient die Datei "__init __. py" als effektiver Namespace. Sie sollten niemals '__init __. Py' direkt importieren. –

1

In Django, hat die Datei manage.py from django.core.management import execute_manager, aber execute_manager ist kein Modul. Es ist eine Funktion innerhalb des __init__.py Moduls des Verzeichnisses management.