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?
Respuestas:
EDITAR noviembre de 2014 (3 años después):
Python 2.6 y 3.x soporta importaciones relativas adecuadas, donde puede evitar hacer algo hack. Con este método, sabe que está obteniendo una importación relativa en lugar de una importación absoluta . El '..' significa, vaya al directorio encima de mí:
Como advertencia, esto solo funcionará si ejecuta su python como un módulo, desde fuera del paquete. Por ejemplo:
Manera hacky original
Puede agregar Common / a su sys.path (la lista de rutas que Python mira para importar cosas):
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.fuente
from ...myfile
va a../../myfile
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:Y, ahora, si desea importar
some_stuff
desde el archivo:Proj/Common/Common.py
a su archivo:,Proj/Client/Client.py
así:Y lo mismo se aplica a
Proj/Server
, también funciona para elsetup.py
proceso, una misma pregunta discutida aquí , ¡espero que ayude!fuente
No hagas una importación relativa.
Desde PEP8 :
Pon todo tu código en un súper paquete (es decir, "myapp") y usa subpaquetes para cliente, servidor y código común.
Actualización: " Python 2.6 y 3.x admite importaciones relativas adecuadas (...) ". Vea las respuestas de Dave para más detalles.
fuente
if __name__ == "__main__":
línea " ". Es decir, desea poder utilizarlos como scripts independientes. ¿Cómo hacerlo correctamente? Creo que es un caso de uso perfectamente común que debería ser compatible. ¿Por qué está desanimado?¡Hacer una importación relativa está absolutamente bien! Esto es lo que hace mi pequeño:
fuente
__file__
para obtener la relación adecuada del archivo actualEl método de importación predeterminado ya es "relativo", de PYTHONPATH. El PYTHONPATH es por defecto para 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
import Common.Common
debería funcionar dentro de Server.py y Client.py.No hagas una importación relativa. No funcionará como usted quiere.
fuente