2009-02-02 47 views
5

Tengo una serie de scripts que usan definiciones comunes. ¿Cómo los divido en múltiples 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 ejecutándose simultáneamente y debe funcionar sin derechos de superusuario. Las soluciones que hemos llegado con son:Cómo modularizar una aplicación de Python

  • código duplicado en cada guión . Desordenado, y probablemente el peor esquema .
  • Poner todos los scripts y código común en un solo directorio, y uso from . import para cargarlos. La desventaja de este enfoque es que Me gustaría poner mis bibliotecas en otro directorio que las aplicaciones.
  • poner el código común en su propio directorio, escribir __init__.py que importa todos los submódulos y finalmente utilizar from . import para cargarlos. Mantiene código organizado, pero es un poco sobrecarga mantener __init__.py y calificar nombres.
  • Agregue el directorio de la biblioteca a sys.path y import. tiendo a esto, pero no estoy seguro de si jugando con sys.path es el código agradable.
  • carga utilizando execfile (exec en Python 3). combina las ventajas de los dos enfoques anteriores : Sólo una línea de por módulo es necesario, y puedo usar un dedicado. Por otro lado, este evade el concepto de módulo python y polutes el espacio de nombres global.
  • escritura e instalar un módulo usando distutils. Este instala la biblioteca para todos los scripts de Python y necesita derechos de superusuario e impactos otras aplicaciones y no es por tanto aplicable en mi caso.

¿Cuál es el mejor método?

Respuesta

8

Agregar a sys.path (usualmente usando site.addsitedir) es bastante común y no particularmente desaprobado. Ciertamente querrás que tus cosas compartidas comunes de trabajo estén en módulos en algún lugar conveniente.

Si está utilizando Python 2.6+, ya existe 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 Unix-likes - ver PEP 370 para más información.

+0

+1: Simplemente configure la variable de entorno PYTHONPATH. Simple, ordenado, portátil, limpio. Funciona en todas partes. –

+0

@ S.Lott: funciona en todos los lugares donde tenga un entorno de shell. Además, necesitas un script de inicio para esto, lo que complica las cosas – phihag

+0

@phihag: en realidad no necesitas un script de inicio. PYTHONPATH se puede configurar en .bashrc o en su configuración de Windows. –

4

Usted puede establecer la variable de entorno PYTHONPATH al 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 un import normal para importarlos.

1

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

Además, distutils le permite especificar un directorio de instalación personalizada con el

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

Sin embargo, ninguno de estos puede ser práctico si es necesario tener múltiples versiones que se ejecutan simultáneamente con los mismos nombres de los módulos. En ese caso, probablemente sea mejor que modifique sys.path.

1

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

3

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

Google tiene plenty of info, pero this parece un buen punto de partida.

Cuestiones relacionadas