top from beyond attempted another python python-3.x import shared-libraries relative-path

from - python relative import



ImportaciĆ³n desde una ruta relativa en Python (5)

EDITAR Nov 2014 (3 años después):

Python 2.6 y 3.x admite importaciones relativas correctas, donde puede evitar hacer cualquier cosa hacky. Con este método, sabrá que obtiene una importación relativa en lugar de una importación absoluta . El ''..'' significa, ve al directorio que está arriba de mí:

from ..Common import Common

Como advertencia, esto solo funcionará si ejecuta su python como un módulo, desde fuera del paquete. Por ejemplo:

python -m Proj

Original hacky way

Este método todavía se usa comúnmente en algunas situaciones, donde en realidad no 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 observa para importar cosas):

import sys, os sys.path.append(os.path.join(os.path.dirname(__file__), ''..'', ''Common'')) import Common

os.path.dirname(__file__) solo le da el directorio en el que se encuentra su archivo python actual, y luego navegamos a ''Common /'' el directorio e importamos ''Common'' el módulo.

Tengo una carpeta para mi código de cliente, una carpeta para mi código de servidor y una carpeta para el código que se comparte entre ellos

Proj/ Client/ Client.py Server/ Server.py Common/ __init__.py Common.py

¿Cómo importo Common.py desde Server.py y Client.py?


¡Hacer una importación relativa es absolutamente correcto! Esto es lo que hace mi pequeño:

#first change the cwd to the script path scriptPath = os.path.realpath(os.path.dirname(sys.argv[0])) os.chdir(scriptPath) #append the relative location you want to import from sys.path.append("../common") #import your module stored in ''../common'' import common.py


El método de importación predeterminado ya es "relativo", desde PYTHONPATH. El PYTHONPATH es por defecto, a algunas bibliotecas del sistema junto con la carpeta del archivo fuente original. Si ejecuta con -m para ejecutar un módulo, el directorio actual se agrega a PYTHONPATH. Entonces, si el punto de entrada de su programa está dentro de Proj, entonces el uso de import Common.Common debería funcionar tanto en Server.py como en Client.py.

No hagas una importación relativa. No funcionará como lo desees.


Es bastante gracioso, el mismo problema que acabo de conocer, y hago este trabajo de la siguiente manera:

combinando con linux command ln , podemos hacer que la cosa suene mucho:

1. cd Proj/Client 2. ln -s ../Common ./ 3. cd Proj/Server 4. ln -s ../Common ./

Y, ahora, si desea importar some_stuff del archivo: Proj/Common/Common.py en su archivo: Proj/Client/Client.py , simplemente así:

# in Proj/Client/Client.py from Common.Common import some_stuff

Y, lo mismo se aplica a Proj/Server , también funciona para el proceso setup.py , una misma pregunta discutida aquí , ¡espero que ayude!


No hacer importación relativa.

De PEP8 :

Las importaciones relativas para las importaciones dentro del paquete son altamente desaconsejadas.

Coloque todo su código en un super paquete (es decir, "myapp") y utilice subpaquetes para el cliente, el servidor y el código común.

Actualización: " Python 2.6 y 3.x admite importaciones relativas correctas (...) ". Vea las respuestas de Dave para más detalles.