web-dev-qa-db-fra.com

Python: importez le package contenant

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

Importation de __init__ à l'intérieur du module n'importera pas le package, mais à la place un module nommé __init__, menant à deux copies de choses avec des noms différents ...

Existe-t-il un moyen Pythonique de le faire?

57
guy

De plus, à partir de Python 2.5, les importations relatives sont possibles. Par exemple:

from . import foo

Citant de http://docs.python.org/tutorial/modules.html#intra-package-references :


En commençant par Python 2.5, en plus des importations relatives implicites décrites ci-dessus, vous pouvez écrire des importations relatives explicites avec la forme d'importation du nom d'importation du module. Ces importations relatives explicites utilisent des points de début pour indiquer les packages actuels et parents impliqués dans l'importation relative. À partir du module environnant par exemple, vous pouvez utiliser:

from . import echo
from .. import formats
from ..filters import equalizer
43
Brian Clapper

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

23
mipadi

Si le package est nommé testmod et que votre fichier init est donc testmod/__init__.py et votre module dans le package est submod.py puis de l'intérieur submod.py fichier, vous devriez juste pouvoir dire import testmod et utilisez tout ce que vous voulez, défini dans testmod.

5
Eli Courtwright

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

import __init__ as top
top.some_function()

Ou peut-être?:

from __init__ import some_function
some_function()
1
cdleary

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

1
mikemike