¿Cómo puedo usar código común en python?

Actualmente estoy manteniendo dos de mis propias aplicaciones. Ambos comparten algunos aspectos comunes y, como resultado, comparten algún código. Hasta ahora, solo he copiado los módulos de un proyecto a otro, pero ahora se está convirtiendo en un problema de mantenimiento. Prefiero tener el código común en un solo lugar, fuera de los dos proyectos, que ambos pueden importar. Luego, cualquier cambio en el código común se reflejará en ambos proyectos.

Mi pregunta es: ¿cómo puedo hacer esto? ¿Puedo crear una biblioteca de este código? Si es así, ¿cómo usan la biblioteca los proyectos dependientes? Creo que una cosa con la que tengo problemas es que el código común no es realmente útil para nadie más, o al menos, no quiero convertirlo en un módulo compatible que otras personas puedan usar.

Si mi pregunta no es clara, por favor hágamelo saber.

No hay nada especial que hacer, Python solo necesita encontrar su módulo. Esto significa que tiene que poner su módulo común en su PYTHONPATH , o agregar su ubicación a sys.path . Mira esto.

Di que tienes

 ~/python/project1 ~/python/project2 ~/python/libs/stuff.py ~/python/libs/other.py 

Puede configurar PYTHONPATH='~/python/libs' en su entorno operativo, o puede hacerlo

 import sys, os sys.path.append(os.path.expanduser('~/python/libs')) # or give the full path 

Después de eso puedes hacer import stuff, other cualquier lugar.

También puedes empaquetar tus cosas, entonces necesitas un diseño como este:

 ~/python/project1 ~/python/project2 ~/python/libs/mylibname/__init__.py ~/python/libs/mylibname/stuff.py ~/python/libs/mylibname/other.py 

~/python/libs/mylibname/__init__.py debe existir, pero puede ser un archivo vacío. Convierte mylibname en un paquete .

Después de agregar la carpeta libs a su ruta como se from mylibname import stuff, other anteriormente, puede hacerlo from mylibname import stuff, other .

Hay muchas formas de factorizar el código para que sea reutilizable. Realmente depende de su situación específica en cuanto a qué funcionará mejor. Factorizar su código en paquetes y módulos separados siempre es una buena idea, por lo que el código relacionado se mantiene agrupado y puede reutilizarse desde otros paquetes y módulos. Factorizar su código en clases dentro de un módulo también puede ayudar a mantener el código relacionado agrupado.

Yo diría que colocar su código común en un módulo o paquete que se encuentra en su PYTHONPATH y que esté disponible para ambas aplicaciones probablemente sea su mejor solución.

Así es como lo haría:

  • Haz un archivo EGG de tu proyecto común:

     ~:zip common.egg common 
  • Haz que el archivo de huevo sea parte de tus bibliotecas

     cp common.egg PROJECT_PATH/lib/ 
  • en tus proyectos:

     import glob import os def main(): path_lib=os.path.abspath(os.path.split(os.path.abspath(sys.modules['__main__'].__file__))[0] + '/../lib') sys.path += glob.glob(path_lib + '/*.egg') from common import stuff stuff.doCommonStuff()