2011-02-03 16 views
11

Creé un proyecto en python, y tengo curiosidad sobre cómo funcionan los paquetes en python.Diseño de directorios de paquetes y proyectos de Python

Aquí es mi estructura de directorios:

top-level dir 
    \ tests 
    __init__.py 
    \ examples 
    __init__.py 
    example.py 
module.py 

¿Cómo hago para module.py incluyendo en mi módulo example.py. Sé que podría establecer PYTHONPATH en el directorio de nivel superior, pero eso no parece una buena solución. Así es como pydev soluciona este problema, pero me gustaría una solución que no requiera actualizar las variables de entorno.

pude poner algo en la parte superior de la example.py para actualizar sys.path así:

from os import path 
import sys 

sys.path.append(path.dirname(path.abspath(path.dirname(__file__)))) 

no creo que esto es una solución apropiada tampoco.

Siento que me falta una parte básica de los paquetes de Python. Estoy probando esto en Python 2.6. Si necesita más aclaraciones, háganmelo saber.

+0

http://jcalderone.livejournal.com/39794.html –

Respuesta

8

paquetes de Python son muy simples: un paquete es un directorio en cualquier entrada en sys.path que tiene un archivo __init__.py. Sin embargo, un módulo solo se considera EN un paquete si se importa a través de una importación relativa como import package.module o from package import module. Tenga en cuenta que esto significa que, en general, alguien debe configurar sys.path para que contenga los directorios sobre cualquier paquete que desee importar, ya sea a través de PYTHONPATH o de otro modo.

La arruga principal es que los módulos principales (los que se ejecutan directamente desde la línea de comandos) son siempre __main__ sin importar su ubicación. Por lo tanto, tienen que hacer importaciones absolutas y confían en que PYTHONPATH se configure o Munge sys.path en sí mismos.

En su caso, recomiendo tener una pequeña secuencia de comandos de Python que ejecute sus ejemplos después de configurar la ruta correcta. Digamos que lo pones en el directorio de nivel superior:

#!/usr/bin/env python 
import sys 
import os.path 

sys.path.append(os.path.dirname(__file__)) 
example = __import__("examples", globals(), locals(), sys.argv[1]) 

Luego tu ejemplo puede hacer "importar módulo".

O bien, si module.py está destinado a estar también en un paquete, agregue el PADRE de su "directorio de nivel superior" a sys.path y luego use la sintaxis from .. import module en los módulos de ejemplo. Además, cambie el primer parámetro al __import__ en el contenedor a "tldname.examples" donde tldname es el nombre de su directorio de nivel superior.

Si no desea confiar en un módulo "ejemplo de corredor", cada ejemplo necesita un texto sys.path, o necesita una configuración PYTHONPATH. Lo siento.

+0

Brillante. El módulo principal que se está tratando especialmente, sin incluir ningún otro módulo, fue la pista que me permitió identificarlo de una manera portátil y agradable. En el método principal ahora, agregamos consistentemente el directorio superior de nuestros proyectos locales al sys.path , y todo lo demás funciona exactamente como se esperaba. ¡Gracias! –

1
+0

Al intentarlo, recibí el siguiente error: ValueError: Intento de importación relativa en no-paquete. Tengo un '__init __. Py' en el directorio de ejemplos y el directorio principal. – Joe

+0

Si no está trabajando en un paquete, entonces sí, debe establecer PYTHONPATH. – Amber

+0

Aunque estoy trabajando en un paquete. Tengo el '__init __. Py' tanto en el directorio de nivel superior como en el directorio de ejemplos. – Joe

Cuestiones relacionadas