2012-04-10 16 views
73

Modifica: in base al commento di Ulf Rompe, è importante utilizzare "1" anziché "0", altrimenti si interromperà sys.path.Perché utilizzare sys.path.append (percorso) anziché sys.path.insert (1, percorso)?

Ho eseguito python da un po 'di tempo (oltre un anno) e sono sempre confuso sul motivo per cui le persone consigliano di utilizzare sys.path.append() anziché sys.path.insert(). Lasciami dimostrare.

Diciamo che sto lavorando a un modulo chiamato PyWorkbooks (che è installato sul mio computer), ma sto contemporaneamente lavorando su un modulo diverso (diciamo PyJob) che incorpora PyWorkbooks. Mentre sto lavorando su PyJob trovo errori in PyWorkbooks che sto correggendo, quindi mi piacerebbe importare una versione di sviluppo.

Ci sono diversi modi per lavorare su entrambi (potrei inserire il mio progetto PyWorkbooks all'interno di PyJob, ad esempio), ma a volte ho ancora bisogno di giocare con il percorso. Tuttavia, non posso semplicemente fare un sys.path.append() nella cartella in cui PyWorkbooks è a. Perché? Perché python troverà prima i miei PyWorkbook installati!

Questo è il motivo per cui si deve fare uno sys.path.insert (1, path_to_dev_pyworkbooks)

In sintesi:

sys.path.append(path_to_dev_pyworkbooks) 
import PyWorkbooks # does NOT import dev pyworkbooks, imports installed one 

o:

sys.path.insert(1, path_to_dev_pyworkbooks) # based on comments you should use **1 not 0** 
import PyWorkbooks # imports correct file 

questo ha causato alcuni hangups per me in passato, e mi piacerebbe molto che noi (come comunità) iniziassimo a raccomandare lo sys.path.insert(1, path), come se stessimo inserendo manualmente un percorso, penso che sia sicuro dire che quello è il percorso tu vuoi usare!

Oppure ho qualcosa che non va? È una domanda che a volte mi dà fastidio e lo volevo allo scoperto!

+1

Ho fatto 's ys.path.insert (1, dev_folder) 'ma non trova ancora il modulo dev e usa solo il modulo installato. Come posso risolvere questo? – endolith

risposta

40

Se si dispone di più versioni di un/modulo di pacchetto, è necessario utilizzare virtualenv (sottolineatura mia):

virtualenv è uno strumento per creare ambienti Python isolati.

Il problema di base affrontato è una delle dipendenze e delle versioni e le autorizzazioni indirette. Immagina di avere un'applicazione che necessita della versione 1 di LibFoo, ma un'altra applicazione richiede la versione 2. Come puoi usare entrambe queste applicazioni? Se si installa tutto su /usr/lib/python2.7/site-packages (o qualunque sia la posizione standard della propria piattaforma), è facile finire in una situazione in cui si esegue l'upgrade involontario di un'applicazione che non dovrebbe essere aggiornata.

O più in generale, cosa succede se si desidera installare un'applicazione e lasciare che sia? Se un'applicazione funziona, qualsiasi modifica nelle sue librerie o nelle versioni di tali librerie può interrompere l'applicazione.

Inoltre, cosa succede se non è possibile installare i pacchetti nella directory globale site-packages? Ad esempio, su un host condiviso.

In tutti questi casi, virtualenv può aiutarti.Crea un ambiente con le proprie directory di installazione, che non condivide le librerie con altri ambienti virtualenv (e facoltativamente non accede alle librerie installate globalmente).

Ecco perché le persone considerano errato insert(0, - è una soluzione incompleta e risolvibile al problema della gestione di più ambienti.

+0

Grazie, sapevo vagamente che esisteva qualcosa del genere ma finora non l'ho ancora verificato. Quindi quello che dovrei fare con questo è eseguire tutto dall'interprete nell'ambiente virtuale ... che potrebbe funzionare pure. Grazie! –

37

Se davvero bisogno di usare sys.path.insert, in considerazione di lasciare sys.path [0] in quanto è:

sys.path.insert(1, path_to_dev_pyworkbooks) 

Questo potrebbe essere importante dal 3 codice parte può contare su sys.path documentation conformità:

Come inizializzato all'avvio del programma, il primo elemento di questa lista, percorso [0], è la directory contenente lo script che è stato utilizzato per invocare l'interprete Python.

12

si confonde il concetto di accodamento e prepending. il seguente codice è anteporre:

sys.path.insert(1,'/thePathToYourFolder/') 

essa pone le nuove informazioni all'inizio (o meglio, la seconda, per la precisione) della sequenza di ricerca che il vostro interprete passerà attraverso. sys.path.append() mette le cose alla fine della sequenza di ricerca.

Si consiglia di utilizzare qualcosa come virtualenv invece di codificare manualmente le directory dei pacchetti in PYTHONPATH ogni volta. per la creazione di vari ecosistemi che separano i tuoi site-packages e le possibili versioni di Python, leggere questi due blog:

  1. python ecosystems introduction

  2. bootstrapping python virtual environments

se si decide di spostare verso il basso il percorso verso l'isolamento dell'ambiente si avvantaggerebbe sicuramente guardando in virtualenvwrapper: http://www.doughellmann.com/docs/virtualenvwrapper/

Problemi correlati