2009-01-12 10 views
54

Dans un module résidant à l'intérieur d'un paquet, j'ai besoin d'utiliser une fonction définie dans le __init__.py de ce paquet. comment puis-je importer le paquet dans le module qui réside dans le paquet, donc je peux utiliser cette fonction?Python: importer le paquet contenant

Importation __init__ à l'intérieur du module ne sera pas importer le package, mais plutôt un module nommé __init__, conduisant à deux copies de choses avec des noms différents ...

est-il un moyen pythonique de le faire?

Répondre

21

Cela ne répond pas exactement à votre question, mais je vais suggérer que vous déplaciez la fonction en dehors du fichier __init__.py, et dans un autre module à l'intérieur de ce paquet. Vous pouvez ensuite facilement importer cette fonction dans votre autre module. Si vous le souhaitez, vous pouvez également avoir une instruction d'importation dans le fichier __init__.py qui importera cette fonction (lorsque le package est importé).

+1

Je me rends compte que je peux le faire, il semble juste plutôt salissant et um, impopulaire. –

+4

Vous ne savez pas à quel point c'est «impythonique»? L'alternative ne serait-elle pas encore plus compliquée, puisque __init__.py n'est pas vraiment un module? –

+15

+1 - l'utilisation d'un 'common.py' dans votre paquetage est une pratique très courante en Python. – cdleary

5

Si le paquet est nommé testmod et votre fichier init est donc testmod/__init__.py et votre module dans le package est submod.py alors à partir de fichier submod.py, vous devriez juste pouvoir dire import testmod et à utiliser ce que vous voulez cela est défini dans testmod.

1

Je ne suis pas tout à fait sûr de ce que la situation, mais cela peut résoudre votre problème "différent nom":

import __init__ as top 
top.some_function() 

Ou peut-être ?:

from __init__ import some_function 
some_function() 
+3

Cela fonctionne, mais au moins dans cPython 2.7, l'interpréteur considère '__init__' comme un module différent de 'top', et donc le fichier' __init __. py' est chargé deux fois. – dimo414

+2

Ceci est une importation relative implicite, et en tant que telle ne fonctionnera pas dans python 3, et est de toute façon mauvaise pratique dans python 2. – habnabit

+1

Cela crée toujours 'sys.modules ['__ init __']'. Fondamentalement, le module '__init __. Py' * ne devrait jamais être directement importé *. Importez le package (le nom du répertoire) à la place. –

42

En outre, à partir de Python 2.5 , les importations relatives sont possibles. par exemple:

from . import foo 

Je cite http://docs.python.org/tutorial/modules.html#intra-package-references:


A partir de Python 2.5, en plus des importations par rapport implicites décrites ci-dessus, vous pouvez écrire explicitement les importations par rapport à la forme d'importation nom d'importation du module déclaration. Ces importations relatives explicites utilisent des points principaux pour indiquer les packages actuels et parents impliqués dans l'importation relative. À partir du module entourant par exemple, vous pouvez utiliser:

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

Cela ne répond pas à la question de savoir comment importer depuis '__init __. Py'. – BrenBarn

+1

@BrenBarn: c'est pourtant le moyen de l'importer; Lorsque vous importez le * package *, le fichier '__init __. py' sert d'espace de nom effectif. Vous ne devriez jamais importer '__init __. Py' directement. –

1

Dans Django, le fichier manage.py a from django.core.management import execute_manager, mais execute_manager est pas un module. C'est une fonction du module __init__.py du répertoire management.