2009-09-30 12 views
9

Tengo problemas para hacer que mis clases python funcionen dentro de la consola de python. Quiero importar automáticamente todas mis clases en el espacio de nombres global para que pueda usarlas sin prefix.module.names.Python: importación de clases de paquetes en el espacio de nombres global de la consola

Esto es lo que tengo hasta ahora ...

projectname/ 
|-__init__.py 
| 
|-main_stuff/ 
    |-__init__.py 
    |-main1.py 
    |-main2.py 
    | 
    |-other_stuff/ 
    |-__init__.py 
    |-other1.py 
    |-other2.py 

Cada archivo define una clase del mismo nombre, por ejemplo, main1.py definirá una clase llamada Main1.

Mi PYTHONPATH es la ruta de acceso absoluta a projectname /.

Tengo un archivo de inicio de Python que contiene lo siguiente:

from projectname import * 

pero esto no me permitió usar mis clases en absoluto. Al iniciar una consola Python me gustaría ser capaz de escribir:

ob=Main1() 

pero Principal1 no está dentro del espacio de nombres actual, por lo que no funciona.

He intentado añadir cosas a los archivos __init__.py ...

En projectname/__init__.py:

import main_stuff 

En projectname/main_stuff/__init__.py:

import other_stuff 
__all__ = ["main1", "main2", "main3"] 

Y así sucesivamente. Y en mi archivo de inicio añadí:

from projectname.main_stuff import * 
from projectname.main_stuff/other_stuff import * 

Sin embargo, para utilizar las clases dentro de la consola Python todavía tengo que escribir:

ob=main1.Main1() 

preferiría no necesitar la parte main1.. ¿Alguien sabe cómo puedo poner automáticamente mis clases en el espacio de nombres global cuando uso la consola de Python?

Gracias.

==== ==== EDITAR

Lo que necesito es importar un paquete a nivel de clase, pero from package import * me da todo a nivel de módulo. Estoy después de una manera fácil de hacer algo como esto:

for module in package do: 
    from package.module import * 

==== ==== OTRA EDICION

acabé añadiendo las importaciones de clase a mi archivo de inicio pitón de forma individual. No es ideal debido a la sobrecarga de mantenerlo, pero hace lo que quiero.

from class1.py import Class1 
from class2.py import Class2 
from class3.py import Class3 

Respuesta

16

Desea utilizar una forma diferente de importación.

En projectname/main_stuff/__init__.py:

from other_stuff import * 
__all__ = ["main1", "main2", "main3"] 

Cuando se utiliza una sentencia como esta:

import foo 

está definiendo el nombre foo en el módulo actual. Entonces puede usar foo.something para obtener las cosas en foo.

Cuando se utiliza esta:

from foo import * 

usted está tomando todos los nombres definidos en foo y definirlos en este módulo (como verter un cubo de nombres de foo en su módulo).

+3

+1 por "verter un cubo de nombres" –

Cuestiones relacionadas