2010-12-27 47 views
28

Tengo una clase Python llamada "ClassA" y otra clase Python que se supone que debe importar ClassA que es "ClassB". La estructura de directorios es la siguiente:Importar desde el directorio hermano

MainDir 
../Dir 
..../DirA/ClassA 
..../DirB/ClassB 

¿Cómo puedo usar sys.path modo que ClassB puede utilizar claseA?

+2

Se llama importaciones en relación y tiene un poco de material de Googleable y SO preguntas. – delnan

+0

http://stackoverflow.com/questions/279237/python-import-a-module-from-a-folder – jgritty

Respuesta

16

que realmente debería estar usando paquetes. Entonces MAINDIR se coloca en un punto en el sistema de archivos en sys.path (por ejemplo .../site-paquetes), entonces se puede decir en ClassB:

from MainDir.Dir.DirA import ClassA # which is actually a module 

sólo hay que colocar los archivos denominados __init__.py en cada directorio para que sea una jerarquía de paquetes.

+0

Agregué MainDir a sys.path e intenté con su solución, pero solo dice que no hay ningún módulo llamado MainDir.Dir.DirA, y __init __. pys en todos los directorios. – skylerl

+3

No agregue MainDir, agregue su directorio principal. Si agrega MainDir (si esa no es la raíz del paquete, eso está bien), entonces importe como 'de Dir.DirA import ClassA' en su lugar. – Keith

21

Puede utilizar relative import (ejemplo de enlace, módulo actual - A.B.C):

from . import D     # Imports A.B.D 
from .. import E    # Imports A.E 
from ..F import G    # Imports A.F.G 
+5

¿Esto no funciona si están en un paquete? – skylerl

+4

@Yakattak: Sí, pero deben estar en un paquete de todos modos;) – delnan

+0

esto parece la mejor y más simple respuesta –

44

como una respuesta literal a la pregunta 'importación de Python desde el directorio padre':

para importar 'mimodulo' que está en el directorio principal de su módulo actual:

import os 
parentdir = os.path.dirname(os.path.dirname(os.path.abspath(__file__))) 
os.sys.path.insert(0,parentdir) 
import mymodule 

editar Desafortunadamente, el atributo __file__ no siempre está configurado. Una forma más segura de obtener el parentdir es a través del módulo de inspección:

import inspect 
currentdir = os.path.dirname(os.path.abspath(inspect.getfile(inspect.currentframe()))) 
parentdir = os.path.dirname(currentdir) 
+0

Esto me ayudó. – odigity

+0

Remi - Gracias por la respuesta literal. Lo encontré útil al escribir el código de prueba para una aplicación de Python. Puedo colocar el código de prueba en un subdirectorio, y puedo comenzar a poner las pruebas en su lugar sin modificar el proyecto existente. (En otras palabras, convertir el código existente en un módulo antes de realizar las pruebas sería el orden incorrecto de hacer las cosas desde la perspectiva de gestionar el riesgo de introducir errores en el código de trabajo.) Su método para cambiar la ruta del módulo es útil. –

+0

¡Esa es la única cosa que simplemente funciona, gracias! –

Cuestiones relacionadas