¿Cuándo sería útil la opción -e o --editable con pip install?

Para algunos proyectos, la última línea de requirements.txt es -e .. ¿Qué hace exactamente?

149
raitisd 28 ene. 2016 a las 17:40

3 respuestas

La mejor respuesta

Como dice la página de manual:

-e,--editable <path/url>
     Install a project in editable mode (i.e.  setuptools "develop mode") from a local project path or a VCS url.

Por lo tanto, usaría esto al intentar instalar un paquete localmente, con mayor frecuencia en el caso de que lo esté desarrollando en su sistema. Simplemente vinculará el paquete a la ubicación original, lo que básicamente significa que cualquier cambio en el paquete original se reflejará directamente en su entorno.

Algunas pepitas tienen el mismo aquí y aquí.

77
Community 23 may. 2017 a las 12:10

Es importante tener en cuenta que pip uninstall no puede no desinstalar un módulo que se haya instalado con pip install -e. Entonces, si sigue esta ruta, prepárese para que las cosas se pongan muy complicadas si alguna vez necesita desinstalar. Una solución parcial es (1) reinstalar, manteniendo un registro de los archivos creados, como en sudo python3 -m setup.py install --record installed_files.txt, y luego (2) eliminar manualmente todos los archivos enumerados, como en p. Ej. sudo rm -r /usr/local/lib/python3.7/dist-packages/tdc7201-0.1a2-py3.7.egg/ (para la versión 0.1a2 del módulo tdc7201). Sin embargo, esto no limpia todo al 100%; incluso después de haberlo hecho, la importación de la biblioteca local (¡eliminada!) puede tener éxito, e intentar instalar la misma versión desde un servidor remoto puede fallar en hacer algo (porque cree que su versión local (¡eliminada!) ya está actualizada. fecha).

2
Howard A. Landman 1 may. 2020 a las 05:39

Ejemplo concreto del uso de --editable en desarrollo

Si juego con este paquete de prueba como en:

cd ~
git clone https://github.com/cirosantilli/vcdvcd
cd vcdvcd
git checkout 5dd4205c37ed0244ecaf443d8106fadb2f9cfbb8
python -m pip install --editable . --user

Produce:

Obtaining file:///home/ciro/bak/git/vcdvcd
Installing collected packages: vcdvcd
  Attempting uninstall: vcdvcd
    Found existing installation: vcdvcd 1.0.6
    Can't uninstall 'vcdvcd'. No files were found to uninstall.
  Running setup.py develop for vcdvcd
Successfully installed vcdvcd-1.0.6

El Can't uninstall 'vcdvcd' es normal: intentó desinstalar cualquier vcdvcd existente para luego reemplazarlo con el "mecanismo similar al enlace simbólico" que se produce en los siguientes pasos, pero falló porque no hubo instalaciones previas.

Luego genera un archivo:

~/.local/lib/python3.8/site-packages/vcdvcd.egg-link

Que contiene:

/home/ciro/vcdvcd
.

Y actúa como un "enlace simbólico" al intérprete de Python.

Así que ahora, si realizo algún cambio en el código fuente de git en /home/ciro/vcdvcd, se refleja automáticamente en los importadores que pueden hacer desde cualquier directorio:

python -c 'import vcdvcd'

Sin embargo, tenga en cuenta que en mi versión pip al menos, los archivos binarios instalados con --editable, como la secuencia de comandos vcdcat proporcionada por ese paquete a través de scripts= en setup.py, no se enlacen simbólicamente, solo se copian en:

~/.local/bin/vcdcat

Al igual que para las instalaciones regulares y, por lo tanto, las actualizaciones del repositorio de git no los afectarán directamente.

En comparación, una instalación normal no --editable desde la fuente de git:

python -m pip uninstall vcdvcd
python -m pip install --user .

Produce una copia de los archivos instalados en:

~/.local/lib/python3.8/site-packages/vcdvcd

La desinstalación de un paquete editable como se hizo anteriormente requiere un pip lo suficientemente nuevo como se menciona en: Cómo desinstalar paquetes editables con pip (instalado con -e)

Probado en Python 3.8, pip 20.0.2, Ubuntu 20.04.

Recomendación: desarrolle directamente en árbol siempre que sea posible

La configuración editable es útil cuando está probando su parche en un paquete a través de otro proyecto.

Sin embargo, si puede probar completamente su cambio en el árbol, simplemente hágalo en lugar de generar una instalación editable que es más compleja.

Por ejemplo, el paquete vcdvcd anterior está configurado de una manera que puede simplemente cd en la fuente y hacer ./vcdcat sin que pip instale el paquete en sí (en general, es posible que deba instalar dependencias desde {{X2 }} aunque), y el import vcdvcd que hace ese ejecutable (o posiblemente su propia prueba personalizada) simplemente encuentra el paquete correctamente en el mismo directorio en el que vive.

2
Ciro Santilli 郝海东冠状病六四事件法轮功 26 ago. 2020 a las 09:38