Cómo modularizar una aplicación Python

Tengo una serie de scripts que utilizan definiciones comunes. ¿Cómo los divido en varios archivos? Además, la aplicación no se puede instalar de ninguna manera en mi escenario; debe ser posible tener un número arbitrario de versiones que se ejecuten simultáneamente y debe funcionar sin derechos de superusuario. Las soluciones que he encontrado son:

  • Código duplicado en cada script. Desordenado, y probablemente el peor de los esquemas.
  • Coloque todos los scripts y el código común en un solo directorio, y use from . import from . import para cargarlos. La desventaja de este enfoque es que me gustaría poner mis bibliotecas en un directorio diferente al de las aplicaciones.
  • Coloque el código común en su propio directorio , escriba un __init__.py que importe todos los submódulos y finalmente use from . import from . import para cargarlos. Mantiene el código organizado, pero es un poco __init__.py mantener __init__.py y calificar los nombres.
  • Agregue el directorio de la biblioteca a sys.path e import . sys.path a esto, pero no estoy seguro de que sys.path con sys.path sea ​​un buen código.
  • Cargar utilizando execfile ( exec en Python 3). Combina las ventajas de los dos enfoques anteriores: solo se necesita una línea por módulo, y puedo usar un dedicado. Por otro lado, esto evade el concepto de módulo de Python y contamina el espacio de nombres global.
  • Escribir e instalar un módulo utilizando distutils . Esto instala la biblioteca para todos los scripts de Python y necesita derechos de superusuario e impacta en otras aplicaciones y, por lo tanto, no es aplicable en mi caso.

¿Cuál es el mejor método?

Agregar a sys.path (usualmente usando site.addsitedir) es bastante común y no está particularmente mal visto. Ciertamente, querrás que tus elementos comunes de trabajo compartidos estén en algún lugar conveniente.

Si está utilizando Python 2.6+, ya hay una carpeta de módulos de nivel de usuario que puede usar sin tener que agregar a sys.path o PYTHONPATH. Es ~ / .local / lib / python2.6 / site-packages en Me gusta de Unix – vea PEP 370 para más información.

Puede establecer la variable de entorno PYTHONPATH en el directorio donde se encuentran los archivos de la biblioteca. Esto agrega esa ruta a la ruta de búsqueda de la biblioteca y puede usar una import normal para importarlos.

Si tiene varios entornos que tienen varias combinaciones de dependencias, una buena solución es usar virtualenv para crear entornos Python de espacio aislado, cada uno con su propio conjunto de paquetes instalados. Cada entorno funcionará de la misma manera que la configuración de paquetes de sitios Python en todo el sistema, pero no se requieren derechos de superusuario para crear entornos locales.

Google tiene mucha información , pero parece un buen punto de partida.

Otra alternativa para agregar manualmente la ruta a sys.path es usar la variable de entorno PYTHONPATH .

Además, distutils permite especificar un directorio de instalación personalizado usando

  python setup.py install --home=/my/dir 

Sin embargo, ninguno de estos puede ser práctico si necesita tener varias versiones ejecutándose simultáneamente con los mismos nombres de módulo. En ese caso, es mejor que modifiques sys.path .

He usado el tercer enfoque (agregar los directorios a sys.path ) para más de un proyecto, y creo que es un enfoque válido.