pythonhome commands python dry pythonpath

commands - pythonpath linux



Práctica recomendada para volver a utilizar el código de Python (4)

Escribí una aplicación de biblioteca de Python (que contiene varios archivos * .py). Y varios de mis proyectos 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 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 . Entonces, 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 la biblioteca a sys.path en el código python: sys.path.append(''/path/to/library/app'')

Entre las tres opciones, ¿cuál prefiere? ¿Qué ventaja tiene en comparación con las otras dos opciones? ¿Tienes alguna otra opción mejor? Se aprecia mucho que alguien con años de experiencia en el desarrollo de Python pueda responder esta pregunta.


De sus tres opciones, PYTHONPATH es el camino a seguir. Copiar y pegar está claramente fuera, 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 a partir de 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.


La primera forma es, como usted mismo notó, apenas aceptable ya que tiene incontables problemas bien conocidos .

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

Cree las partes comunes, que al parecer ya trata como una biblioteca autónoma (¡bien!), Un proyecto completamente desarrollado por derecho propio, con un setup.py que permite instalar y agregar PYTHONPATH de forma multiplataforma con un solo comando. No es necesario que realmente 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 fueran más fáciles para cada usuario potencial.


Permítanme proponer una cuarta alternativa: tómense el tiempo para aprender a 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/


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

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

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

Establecer / agregar dinámicamente cosas 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.