2009-01-12 30 views
54

En un módulo que reside dentro de un paquete, tengo la necesidad de utilizar una función definida dentro del __init__.py de ese paquete. ¿cómo puedo importar el paquete dentro del módulo que reside dentro del paquete, entonces puedo usar esa función?Python: importar el paquete que contiene

Importación __init__ en el interior del módulo no importará el paquete, pero en su lugar un módulo denominado __init__, dando lugar a dos copias de las cosas con diferentes nombres ...

¿Hay una manera de hacer esto Pythonic?

Respuesta

21

Esto no responde exactamente a su pregunta, pero le sugiero que mueva la función fuera del archivo __init__.py y dentro de otro módulo dentro de ese paquete. A continuación, puede importar fácilmente esa función a su otro módulo. Si lo desea, puede tener una declaración de importación en el archivo __init__.py que importará esa función (también cuando se importe el paquete).

+1

me doy cuenta de que puedo hacer esto, parece bastante desordenado y um, antiponético. –

+4

¿No estás seguro de cómo es esto "antiponético"? ¿No sería la alternativa aún más complicada, ya que __init__.py no es realmente un módulo? –

+15

+1 - usar un 'common.py' dentro de tu paquete es una práctica muy común en Python. – cdleary

5

Si el paquete se llama testmod y por lo tanto su archivo de inicio es testmod/__init__.py y su módulo dentro del paquete es submod.py luego desde dentro submod.py archivo, sólo debe ser capaz de decir import testmod y el uso lo que quiera que eso define en testmod.

1

No estoy totalmente seguro de cuál es la situación, pero esto puede resolver su "nombre diferente" problema:

import __init__ as top 
top.some_function() 

O tal vez ?:

from __init__ import some_function 
some_function() 
+3

Esto funciona, pero al menos en cPython 2.7 el intérprete considera que '__init__' es un módulo diferente de 'top', y entonces el archivo' __init __. py' se carga dos veces. – dimo414

+2

Esta es una importación relativa implícita, y como tal no funcionará en python 3, y es una mala práctica en python 2 de todos modos. – habnabit

+1

Esto todavía crea 'sys.modules ['__ init __']'. Básicamente, el módulo '__init __. Py' nunca se debe importar directamente *. Importe el paquete (el nombre del directorio) en su lugar. –

42

Además, a partir de Python 2.5 , las importaciones relativas son posibles. por ejemplo:

from . import foo 

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


A partir de Python 2.5, además de las importaciones en relación implícitos descritos anteriormente, puede escribir las importaciones en relación explícita con la del módulo de formulario nombre de importación de importación declaración. Estas importaciones relativas explícitas usan puntos iniciales para indicar los paquetes actuales y principales involucrados en la importación relativa. Desde el módulo rodea, por ejemplo, es posible utilizar:

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

Esto no responde a la pregunta de cómo importar de '__init __. Py'. – BrenBarn

+1

@BrenBarn: sin embargo, esta es la forma de importarlo; cuando importa el * paquete *, el archivo '__init __. py' sirve como el espacio de nombres efectivo. Nunca debe importar '__init __. Py' directamente. –

1

En Django, el archivo tiene manage.py from django.core.management import execute_manager, pero execute_manager no es un módulo. Es una función dentro del módulo __init__.py del directorio management.

Cuestiones relacionadas