Come posso sovrascrivere i moduli Python predefiniti con quelli che installo con pip?

0

Ho incontrato questo problema con PIL e Pillow. Non avevo realizzato che il PIL fosse già installato, quindi ho eseguito:

sudo pip install PIL

Come meglio sapevo, ha installato PIL. Poi ho scritto un programma che utilizzava una funzione in PIL che non funzionava a causa di un bug all'interno di PIL. Ho iniziato a lavorare su questo problema e qualcuno ha raccomandato di disinstallare PIL e installare Pillow, che ha un'interfaccia migliore per PIL. Così ho fatto:

sudo pip uninstall PIL
sudo pip install Pillow

Quindi, in una nuova finestra di Terminale che avevo appena aperto, ho eseguito uno script Python che includeva la linea:

import Pillow

e viene visualizzato questo messaggio di errore:

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

ma se corro:

pip show Pillow

Ottengo:

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

Ho disinstallato Pillow, quindi l'ho installato con l'opzione --user e l'ho installato nella struttura del mio account Library, ma non funzionava. Ho provato quasi tutte le combinazioni che posso immaginare per installare PIL o Pillow (mai entrambe contemporaneamente), ma non importa cosa faccio, non posso importare Pillow. Python (versione 2.7) non lo riconosce mai come esistente. È lì, ho controllato la directory e pip mostra che è lì, ma non lo è.

Ho installato altri moduli con pip e sono messi nella stessa directory (/Library/Python/2.7/site-packages) e sono riconosciuti.

Come meglio posso dire, dal momento che PIL è incluso nell'installazione di Apple di Python, con tutti i moduli nell'albero della directory /System/Library/Framework/Python.framework/, quando uso pip per installarlo (o Pillow) , è ignorato da Python.

Prima di questo, avevo /Library/Python/2.7/site-packages in PYTHONPATH prima di qualsiasi elenco di qualsiasi directory nell'albero della directory / System. Ho anche, in /Library/Python/2.7/site-packages, un file chiamato bypass-Apple-SIP.pth. Si suppone che l'estensione .pth aiuti a sostituire i moduli nell'albero delle directory / System. All'interno di questo file è:

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

Da quello che posso dire, questo ha funzionato prima, ma non avevo a che fare con il tentativo di sostituire qualsiasi modulo che è stato installato di default con l'installazione Python di Apple.

In passato ho usato MacPorts e ho scoperto che odiavo e avevo problemi con Perl (e, penso, con Python). Non voglio usarlo, Fink, Homebrew o qualcosa del genere.

A quanto vedo, mi piacerebbe trovare un modo per fare uno di questi:

  1. Disinstalla il PIL installato da Apple
  2. Assicurati che Python assegni la priorità ai moduli in /Library/Python/2.7/site-packages sui moduli preesistenti
  3. Ottieni Python per vedere le installazioni dei pip dei moduli nella struttura della mia directory home e usarli sui moduli preinstallati
  4. Qualcos'altro che mi permetta di sovrascrivere i moduli in /System/Library/Frameworks/Python.framework/ se ho problemi con quei moduli preinstallati.

Come posso fare qualcosa di simile a queste idee per usare Pillow over PIL e fare in modo che Python ignori la vecchia versione 1.x di PIL installata da Apple?

    
posta Tango 12.07.2018 - 09:19
fonte

1 risposta

1

La soluzione a questo è ambienti virtuali.

Ogni ambiente che possiedi può avere librerie separate non conflittuali (e versioni python) in modo da avere un cuscino e un altro pil.

Il proine è fondamentalmente

  1. Crea un nuovo ambiente - questo creerà collegamenti a python ecc.
  2. Installa le librerie desiderate
  3. Modifica l'ambiente della shell in modo che il percorso rimandi al python creato nel passaggio 1

Gli strumenti sono inclusi in python 3.6 e 3.7 . Per passare da una versione all'altra di Python vedi pyenv .

Se hai bisogno di installare un altro python potresti anche considerare conda . Questo può includere 2.7 ed è una sorta di equivalente alla combinazione sopra ma include i binari delle librerie C.

Per Apple's python 2.7 vedi pipenv & ambienti virtuali

    
risposta data 12.07.2018 - 11:04
fonte

Leggi altre domande sui tag