¿Pip sobrescribe los paquetes instalados por apt-get?

9

¿Qué sucede si accidentalmente pip installun paquete que ya instalé usando de apt-getantemano? ¿Simplemente uso la última versión (es decir, probablemente la que instalé usando pip)? ¿Qué sucede al revés?

Nota: No uso Python en un entorno virtual (simplemente porque no sé por qué debería hacerlo; uso Python como herramienta de análisis de datos y sobre todo trato de usar la última versión de todo).

Fred S
fuente
Si no me equivoco, no instales los mismos paquetes usando apt-getypip
Lucio
Corerct, los pipinstala en /usr/localsubdirectorios de forma predeterminada o en cualquier otro directorio si lo desea.
Timo
3
Pero, ¿qué sucede, por ejemplo, si primero lo hago apt-get install python-pandasseguido pip install pandas, o al revés? ¿Cómo sabe mi instalación global de Python cuál de las dos versiones usar?
Fred S
1
@FredS: Ejecute el siguiente comando en la terminal, Python buscará en ese orden específico un módulo:python -c "import sys; print sys.path"
Timo

Respuestas:

3

Como @Timo mencionó en su comentario, python -c "import sys; print sys.path"le dará la ruta de carga del módulo Python para su instalación de Python. En una instalación relativamente nueva de 16.04, hay tres directorios notables (entre los 10 totales que estaban en el mío):

  • '' (directorio de la aplicación)
  • '/usr/local/lib/python2.7/dist-packages' (donde pip instala módulos)
  • '/usr/lib/python2.7/dist-packages' (donde apt install modules)

Sin embargo, lo más importante que se debe tener en cuenta es que '/usr/local/lib/python2.7/dist-packages' tiene MAYOR precedencia que '/usr/lib/python2.7/dist-packages'.

Si primero instala un paquete de Python a través de apt (-get), se instalará en '/usr/lib/python2.7/dist-packages'. Si luego intenta usar pip para instalar el módulo, pip inicialmente le dará una advertencia de que la dependencia ya se ha cumplido, luego salga; agregar el indicador --upgrade forzará la instalación de pip, instalando el módulo en '/usr/local/lib/python2.7/dist-packages'. (Observe el resultado de que también se dice que la versión de '/usr/lib/python2.7/dist-packages' no se desinstala) A continuación, puede verificar que la versión PIP-instalado es el que está siendo utilizado por el uso de los siguientes: python -c "import MODULE; print MODULE.__file__".

Como tal, esto muestra que los paquetes instalados a través de pip tendrán prioridad sobre los paquetes instalados por el sistema, pero no sobrescribirán nada instalado desde apt (-get).

Bryan Wyatt
fuente
1

Para agregar a @Bryan Wyatt, parece deseable (y previsto) que los elementos PIP instalados / actualizados tengan prioridad sobre los paquetes instalados APT (probablemente más antiguos). Mi sistema tenía los caminos apt y pip invertidos. Debería ser (ignorando otras entradas):

  • '/usr/local/lib/python2.7/dist-packages' (donde pip instala módulos)
  • '/usr/lib/python2.7/dist-packages' (donde apt install modules)

Sin embargo, debido a alguna acción desconocida que debo haber tomado, estos caminos aparecieron en el orden opuesto para mí (ignorando otras entradas):

  • '/usr/lib/python2.7/dist-packages' (donde apt install modules)
  • '/usr/local/lib/python2.7/dist-packages' (donde pip instala módulos)

Resulta algo que yo añadí /usr/lib/python2.7/dist-packagesa /usr/local/lib/python2.7/dist-packages/easy-install.pth. Simplemente quitando la línea de easy-install.ptharreglado el error para mí. /usr/lib/python2.7/dist-packagestodavía está en mi camino, ya que se agrega en una etapa posterior en otro lugar.

Como nota al margen, pprint mostrará su camino mejor ... es decir:

$ python -c "import sys; import pprint; pprint.pprint(sys.path)"
['',
 '/usr/lib/python2.7',
 '/usr/lib/python2.7/plat-x86_64-linux-gnu',
 '/usr/lib/python2.7/lib-tk',
 '/usr/lib/python2.7/lib-old',
 '/usr/lib/python2.7/lib-dynload',
 '/usr/local/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages',
 '/usr/lib/python2.7/dist-packages/PILcompat',
 '/usr/lib/python2.7/dist-packages/gtk-2.0',
 '/usr/lib/python2.7/dist-packages/ubuntu-sso-client']
proximous
fuente