Solución:
EDITAR noviembre de 2014 (3 años después):
Python 2.6 y 3.x admiten las importaciones relativas adecuadas, donde puede evitar hacer algo pirata. Con este método, sabrá que está obteniendo un relativo importar en lugar de un absoluto importar. El ‘..’ significa, vaya al directorio encima de mí:
from ..Common import Common
Como advertencia, esto solo funcionará si ejecuta su Python como un módulo, desde fuera de del paquete. Por ejemplo:
python -m Proj
Manera hacky original
Este método todavía se usa comúnmente en algunas situaciones, donde en realidad nunca está ‘instalando’ su paquete. Por ejemplo, es popular entre los usuarios de Django.
Puede agregar Common / a su sys.path (la lista de rutas que Python mira para importar cosas):
import sys, os
sys.path.append(os.path.join(os.path.dirname(__file__), '..', 'Common'))
import Common
os.path.dirname(__file__)
simplemente le da el directorio en el que se encuentra su archivo Python actual, y luego navegamos a ‘Común /’ el directorio e importamos ‘Común’ el módulo.
Es bastante gracioso, el mismo problema que acabo de conocer, y obtengo este trabajo de la siguiente manera:
combinando con el comando linux ln
, podemos hacer que las cosas sean mucho más sencillas:
1. cd Proj/Client
2. ln -s ../Common ./
3. cd Proj/Server
4. ln -s ../Common ./
Y ahora si quieres importar some_stuff
desde el archivo: Proj/Common/Common.py
en su archivo: Proj/Client/Client.py
, así como esto:
# in Proj/Client/Client.py
from Common.Common import some_stuff
Y lo mismo se aplica a Proj/Server
, También funciona para setup.py
proceso, una misma pregunta discutida aquí, ¡espero que ayude!
No hagas una importación relativa.
Desde PEP8:
Se desaconsejan en gran medida las importaciones relativas para las importaciones dentro del paquete.
Pon todo tu código en un superpaquete (es decir, “myapp”) y usa subpaquetes para cliente, servidor y código común.
Actualizar:
“Python 2.6 y 3.x admite importaciones relativas adecuadas (…)“. Consulte las respuestas de Dave para obtener más detalles.