2011-01-23 20 views
5

Si Tengo una configuración de directorio src así:importaciones básico Python cuestionar

main.py 
pkg1: 
    __init__.py 
    util.py 
pkg2: 
    __init__.py 
    test.py 

¿Me la mejor manera de importar pkg1.util de main.py y desde test.py decir?

Gracias! (Si tengo que tener otro archivo __init__.py en el directorio raíz, que me haga saber?)

Respuesta

5

Ya que mencionas que este es Python 3, no es necesario que agregue lo siguiente a sus archivos .py. Aun así, aunque, ya que ayuda al revés portabilidad si algún pobre diablo que está pegado en Python 2 tiene que utilizar su código:

from __future__ import absolute_import 

Dado que usted está utilizando Python 3, o que está utilizando Python 2 y ha incluido la línea anterior, aquí es su respuesta:

de main.py:

import pkg1.util as util 

de test.py que usaría una de dos maneras dependiendo de si se considera pkg1 y pkg2 estar cosas que siempre se implementarían juntas de la misma manera en relación entre sí, o si, en cambio, siempre se implementarán de forma semiindependiente en el nivel superior. Si la primera, que podría hacer esto:

from ..pkg1 import util 

y si es la segunda opción, esto:

import pkg1.util as util 

Esto implica, por supuesto, que siempre está ejecutando Python desde el directorio en el que main.py es, o que ese directorio está en PYTHONPATH o termina en sys.path por algún motivo (como ser el principal directorio de paquetes de sitios de Python, por ejemplo).

+0

Si existe un 'pkg1' diferente por alguna razón en' PYPATH', ¿seguiré obteniendo * this * 'pkg1' con estas dos opciones? –

+0

@aharon: no existe ninguna opción que le prometa que obtendrá el 'pkg1' previsto sin tener que jugar con' sys.path' usted mismo para asegurarse de que el directorio apropiado sea el primero en la ruta. Tener nombres de paquete conflictivos de esta manera es una muy mala idea a menos que tenga un sistema de administración de paquetes como 'setuptools' que esté administrando el paquete como un 'paquete de espacio de nombres'. – Omnifarious

+3

¿No requerirá todo esto un '__init__py' en el mismo directorio que' main.py'? Tal como está, 'test.py' y' util.py' están en paquetes completamente separados que no son subpaquetes de un superpaquete común. –

1

De main.py:

import pkg1.util 

De test.py:

from ..pkg1 import util 
Cuestiones relacionadas