Mejores prácticas para reutilizar el código python

Escribí una aplicación de biblioteca de Python (que contiene varios archivos * .py). Y varios de mis proyectos de Python necesitan reutilizar el código en la aplicación de la biblioteca. ¿Cuál es la mejor práctica recomendada para reutilizar el código de Python? Actualmente he pensado en tres opciones:

  1. Copiar y pegar. Esto está muy lejos de las mejores prácticas. Viola el principio DRY. (No te repitas.)
  2. Agregue la carpeta de la aplicación de biblioteca a la variable de entorno PYTHONPATH: export PYTHONPATH=/path/to/library/app . Luego, todos los proyectos en la misma computadora pueden hacer referencia al código en la aplicación de la biblioteca.
  3. Y la carpeta de la aplicación de biblioteca a sys.path en el código python: sys.path.append('/path/to/library/app')

Entre las tres opciones anteriores, ¿cuál prefieres? ¿Qué ventaja tiene en comparación con las otras dos opciones? ¿Tienes alguna otra opción mejor? Es muy apreciado que si alguien con años de experiencia en el desarrollo de Python pudiera responder a esta pregunta.

Permítame proponer una cuarta alternativa: tómese el tiempo para aprender cómo empaquetar su biblioteca e instalarla en sus paquetes de sitio; es más fácil de lo que uno puede pensar y estoy convencido de que es un tiempo bien empleado. Este es un muy buen punto de partida: https://packaging.python.org/en/latest/

De sus tres opciones, PYTHONPATH es el camino a seguir. Copiar y pegar está claramente disponible, y agregar código a sus otros proyectos para modificar sys.path simplemente contamina esos archivos con conocimiento sobre su entorno.

Una cuarta opción es crear un verdadero paquete instalable desde su código común e instalarlo en su instalación de Python. Luego, simplemente puede importar esos módulos como cualquier otro código de instalación de terceros.

Si es una biblioteca compartida, debe empaquetarla y agregarla a los paquetes de sitio, y entonces no tendrá que preocuparse por configurar nada. Esta es la mejor opcion.


Si no desea utilizar paquetes de sitio, use PYTHONPATH. Es por eso que existe, y es la manera de hacer lo que quieres.


Es posible que desee examinar el uso de site.addsitedir , path.append no evita los duplicados. También le permitirá aprovechar los archivos .pth.

Configurar / agregar cosas dinámicamente a PYTHONPATH a través de sys.path logra el mismo resultado, pero puede complicar las cosas si elige reutilizar su nueva biblioteca. También causa problemas si sus rutas cambian, tiene que cambiar el código frente a una variable de entorno. A menos que sea completamente necesario, no debe configurar dinámicamente su ruta de Python.


Copiar y pegar no es un patrón de reutilización. No estás reutilizando nada de lo que estás duplicando y aumentando el mantenimiento.

La primera forma es, como usted mismo señaló, difícilmente aceptable, ya que tiene innumerables problemas conocidos .

Los otros dos tienen sus propios problemas. Para empezar, requieren trabajo manual cuando los archivos se mueven (especialmente mal si lo mezcla con la lógica de la aplicación, es decir, póngalo en archivos * .py en lugar de dejarlo en la computadora en la que se ejecuta) y requiere ubicaciones de instalación fijas (rutas absolutas ) o al menos una cierta estructura de directorio (rutas relativas). En mi humilde opinión, estas formas solo son aceptables si las aplicaciones no se van a mover a ningún otro lugar. Tan pronto como sea necesario, debe renunciar y usar la solución existente como la única razón para no usarla, ya que es una exageración para los scripts pequeños y locales, ya no se aplica:

Haga las partes comunes, que aparentemente ya considera como una biblioteca independiente (¡bien!), Un proyecto completo por derecho propio, con un setup.py que permite instalar y agregar PYTHONPATH de forma multiplataforma con Un solo comando. No es necesario que lo publique en PyPI, pero lo hace más fácil si cambia de opinión en el futuro. Si lo hace y también publica algunos de sus proyectos en PyPI, también hizo que la instalación del proyecto en cuestión y sus dependencias sea más fácil para todos los usuarios potenciales.