Importaciones relativas de Python dentro de un paquete que no está en la ruta

¿Cómo puedo importar un archivo que está en un directorio principal dentro de un paquete de python (que no está en la ruta) a un archivo en un directorio secundario?

No estoy del todo claro sobre el vocabulario del empaquetado de python, así que a modo de ejemplo:

dir1/ __init__.py runner.py in_dir1.py dir2/ __init__.py in_dir2.py 

dir1 / in_dir1.py:

 def example(): print "Hello from dir1/in_dir1.example()" 

dir1 / dir2 / in_dir2.py

 import in_dir1 #or whatever this should be to make this work print "Inside in_dir2.py, calling in_dir1.example()" print in_dir1.example() 

Dado que dir1 no está en la ruta de acceso de python, estoy buscando la mejor manera de importar in_dir1 en in_dir2 .

Intenté from .. import in_dir1 y from ..dir1 import in_dir1 basado en este Q / A, pero ninguno funciona. ¿Cuál es la forma correcta de ejecutar esa intención? Esta Q / A parece contener la respuesta; sin embargo, no estoy muy seguro de qué hacer / cómo resolver realmente mi problema usando PEP 366

Ambos archivos __init__.py están vacíos y estoy en v2.6 .

Estoy intentando hacer esto sin usar ninguno de los trucos de ruta que Google sigue mostrando.

La respuesta está en el enlace que diste:

Las importaciones relativas utilizan el atributo __name__ de un módulo para determinar la posición de ese módulo en la jerarquía de paquetes. Si el nombre del módulo no contiene ninguna información de paquete (por ejemplo, está configurado como ‘ principal ‘), las importaciones relativas se resuelven como si el módulo fuera un módulo de nivel superior, independientemente de dónde se encuentre el módulo en el sistema de archivos.

No puede realizar importaciones relativas en __main__ scripts (es decir, si ejecuta directamente python in_dir2.py ).

Para resolver esto, lo que PEP 366 le permite hacer es configurar el __package__ global:

 import dir1 if __name__ == '__main__': __package__ = 'dir1.dir2' from .. import in_dir1 

Tenga en cuenta que el paquete dir1 todavía tiene que estar en sys.path ! Puedes manipular sys.path para lograr esto. Pero para entonces, ¿qué ha logrado sobre las importaciones absolutas?

Realmente puedes hacer esto:

 import sys sys.path.append('..') 

y eso funcionará. Pero no hagas eso. Podría romper otros módulos.

Supongo que podría eliminarlo directamente después de la importación, pero no lo haga.

EDITAR:

En realidad, esto también funciona y creo que no hay razón para que no sea seguro:

Dentro de in_dir2.py puedes hacer:

 import sys import os current_module = sys.modules[__name__] indir2file=current_module.__file__ sys.path.append(os.path.dirname(os.path.abspath(indir2file))+os.sep+".."+os.sep) import in_dir1 

Trate de reestructurar su código en su lugar.