1 votos

¿Cómo puedo anular los módulos de Python predeterminados con los que instalo con pip?

Me encontré con este problema con PIL y Pillow. No me di cuenta de que PIL ya estaba instalado, así que ejecuté:

sudo pip install PIL

Según entendía, se instaló PIL. Luego escribí un programa que usaba una característica en PIL que no funcionaría debido a un error dentro de PIL. Empecé a trabajar en resolver ese problema y alguien recomendó desinstalar PIL e instalar Pillow, que tiene una mejor interfaz que PIL. Así que hice lo siguiente:

sudo pip uninstall PIL
sudo pip install Pillow

Luego, en una nueva ventana de Terminal que acababa de abrir, ejecuté un script de Python que incluía la línea:

import Pillow

y obtengo este mensaje de error:

Traceback (most recent call last):
  File "../HalPy/LandSearch/GetOurLotMap.py", line 7, in 
    import Pillow
ImportError: No module named Pillow

pero si ejecuto:

pip show Pillow

Obtengo:

---
Name: Pillow
Version: 5.2.0
Location: /Library/Python/2.7/site-packages
Requires: 

Desinstalé Pillow luego lo instalé con la opción --user y se instaló en el árbol de directorios de mi cuenta Library, pero eso no funcionó. He intentado casi todas las combinaciones que se me ocurren para instalar PIL o Pillow (nunca ambos al mismo tiempo), pero no importa lo que haga, no puedo importar Pillow. Python (versión 2.7) nunca lo reconoce como existente. Está allí, he revisado el directorio y pip muestra que está allí, pero no está.

He instalado otros módulos con pip y se colocan en el mismo directorio (/Library/Python/2.7/site-packages) y son reconocidos.

Según puedo decir, dado que PIL está incluido en la instalación de Python de Apple, con todos los módulos en el árbol de directorios /System/Library/Frameworks/Python.framework/, cuando uso pip para instalarlo (o Pillow), es ignorado por Python.

Antes de esto, tenía /Library/Python/2.7/site-packages en PYTHONPATH antes de cualquier lista de cualquier directorio en el árbol de directorios /System. También tengo, en /Library/Python/2.7/site-packages, un archivo llamado bypass-Apple-SIP.pth. La extensión .pth se supone que lo ayuda a sobrescribir los módulos en el árbol de directorios /System. Dentro de este archivo está:

import sys
sys.path = ['/Library/Python/2.7/site-packages'] + sys.path

Según puedo decir, esto ha funcionado antes, pero no estaba intentando sobrescribir ningún módulo que estuviera instalado por defecto con la instalación de Python de Apple.

En el pasado usé MacPorts y descubrí que lo odiaba y tenía problemas con Perl (y, creo, Python). No quiero usar eso, Fink, Homebrew, ni nada por el estilo.

Según lo veo, me gustaría encontrar una manera de hacer una de estas opciones:

  1. Desinstalar el PIL instalado por Apple
  2. Asegurarme de que Python dé prioridad a los módulos en /Library/Python/2.7/site-packages sobre los módulos preexistentes
  3. Hacer que Python vea cualquier módulo que pip instale dentro de mi árbol de directorios de inicio y los use sobre los módulos preinstalados
  4. Cualquier otra cosa que me permita anular los módulos en /System/Library/Frameworks/Python.framework/ si tengo problemas con esos módulos preinstalados.

¿Cómo puedo hacer algo similar a alguna de esas ideas para usar Pillow en lugar de PIL y hacer que Python ignore la antigua versión 1.x de PIL que instaló Apple?

0 votos

¿Por qué estás usando 2.7? Solo debes hacerlo si hay una biblioteca vieja que debas usar. la versión actual es 3.7 que incluye una solución para esto. (También hay una solución para 2.7)

0 votos

No he tenido tiempo de revisar mis cosas y asegurarme de que estén actualizadas para que funcionen con la versión 3.7. Lo haré en algún momento, pero no por ahora. Si hay una solución para la versión 2.7, ¡me encantaría saber cuál es!

1voto

yoliho Puntos 340

La solución a esto son entornos virtuales.

Cada entorno que tengas puede tener bibliotecas separadas que no entren en conflicto (y versiones de Python) para que uno pueda tener pillow y otro pil.

El proceso es básicamente

  1. Crear un nuevo entorno: esto creará enlaces a Python, etc.
  2. Instalar las bibliotecas que desees
  3. Modificar tu entorno de shell para que la ruta apunte al Python que creaste en el paso 1

Las herramientas están incluidas en Python 3.6 y 3.7. Para cambiar entre diferentes versiones de Python, consulta pyenv.

Si necesitas instalar otro Python, también puedes considerar conda. Esto puede incluir la versión 2.7 y es algo equivalente a la combinación anterior, pero incluye binarios de bibliotecas C.

Para el Python 2.7 de Apple, consulta pipenv y entornos virtuales

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X