2011-06-19 14 views
18

Ho varie versioni di python installate sul mio Mac usando Macports. Quando ho selezionato python 2.7 tramite $ port select python python27, virtualenvwrapper funziona perfettamente.Utilizzo di diverse versioni di python con virtualenvwrapper

Ma se seleziono un'altra versione di Python, cioè 2.6, virtualenvwrapper genera un messaggio di errore: ImportError: No module named virtualenvwrapper.hook_loader

ho controllato il mio .profile e sta impostando VIRTUALENVWRAPPER_PYTHON-/opt/local/bin/python, così sembra me virtualenvwrapper dovrebbe funzionare indipendentemente da quale python ho selezionato.

Qualche idea su cosa potrebbe causare virtualenvwrapper per generare un errore .hook_loader quando cambio versioni di python?

+8

Senza passare attraverso "port select ..." e attaccato con la base 2.7, funziona semplicemente "mkvirtualenv --python/path/to/python2.6'? Dovrebbe automaticamente passare a (e impostare l'ambiente con) l'interprete corretto. Nel mio sistema (configurato con homebrew), 'mkvirtualenv -p python2.6' funziona correttamente. –

+0

Non riesco a ottenere l'errore hook_loader, ma si lamenta della mancanza di DEST_DIR $ mkvirtualenv --python /opt/local/bin/python2.7 Esecuzione virtualenv con interprete /opt/local/bin/python2.7 È necessario fornire un DEST_DIR – wmfox3

+1

Whoops, mi dispiace - lasciato fuori l'argomento chiave! Questo dovrebbe essere 'mkvirtualenv --python /path/to/python2.6 env_name'. mkvirtualenv crea una cartella chiamata "env_name" nel tuo '$ WORKON_HOME', che viene passato a virtualenv come argomento' DEST_DIR'. Senza specificare un nome, sarebbe difficile capire dove mettere le cose, questo è certo. –

risposta

19

So che questo è praticamente risolto nei vostri commenti, ma è SOLO MAC,

e ancora di più penso che il modo corretto dovrebbe essere quello di impostare VIRTUALENVWRAPPER_PYTHON al vero pitone che si sta utilizzando sulla linea di comando.

Per essere sicuri che tu possa fare which python.

In realtà, anche si può fare:

export VIRTUALENVWRAPPER_PYTHON=`which python` 

su linux faccio questo nel mio .bashrc, quindi, nel complesso, supponendo che si è installato virtualenv e creato il primo "ambiente virtuale" virtualenv (come l'originale)

. virtualenv/bin/activate 
export WORKON_HOME=$HOME/.virtualenvs # or whatever else you want 
export VIRTUALENVWRAPPER_PYTHON=`which python` 
export PROJECT_HOME=SOMETHING 
source $HOME/virtualenv/bin/virtualenvwrapper.sh # or wherever else you got that installed 

(e tra l'altro, hai scritto:

I checked my .profile and it's setting VIRTUALENVWRAPPER_PYTHON to /opt/local/bin/python, so it seems to me virtualenvwrapper should work regardless of which python I've selected

WHI ch è in realtà l'opposto - virtualenv si basa sull'uso del python corretto (e dei pacchetti che lo accompagnano) quindi è molto importante impostare il percorso python di conseguenza.

Anche l'esecuzione di un file py con un "#!/Bin/python" potrebbe causare problemi una volta virtualizzati!

+4

Eseguendo alcuni test sul mio Mac - appare 'VIRTUALENVWRAPPER_PYTHON' controlla solo quale eseguibile Python è usato da' virtualenvwrapper' stesso, non il file eseguibile installato nell'ambiente virtuale ad es. quando esegui 'mkproject'. Mi piacerebbe essere sbagliato ma finora sembra che l'unico modo per scegliere una versione diversa di Python sia usare '-p/--python' nella riga di comando' virtualenvwrapper'. Se è vero, è un peccato. –

+0

@ChrisJohnson mmmh da allora ho smesso di usare virtualenvwrapper - non ne ho più avuto bisogno - non ho un modo semplice per ricontrollare velocemente, ma potresti davvero avere ragione ... Anche su MAC io uso brew ora ... – Stefano

+0

Same come @ChrisJohnson su ubuntu. il mio 'VIRTUALENVWRAPPER_PYTHON' era impostato su python2, ma' mkvirtualenv' stava creando virtualenvs con python3. –

-1

Si (l'OP) sembra aver installato virtualenv e virtualenvwrapper con python2.7 e non con python2.6. Se python2.6 viene chiamato nel momento in cui la shell carica lo script virtualenvwrapper.sh, non è felice. Abbastanza diretto.

VIRTUALENVWRAPPER_PYTHON è fatto per quelle situazioni. Con esso, puoi essere sicuro di usare sempre la giusta versione di python, e non devi sempre aggiungere che -p /path/to/python2.7

Quindi, non sono d'accordo con la risposta di Stefano in quel caso, nella situazione dell'OP, tu avrebbe dovuto spiegare chiaramente nella vostra .bashrc che python da usare:

... 
export VIRTUALENVWRAPPER_PYTHON=/path/to/your/python2.7 
source /path/to/bin/virtualenvwrapper.sh 

Come quella che dovrebbe essere ok per tutto il tempo! Virtualenvwrapper è fatto per semplificare le cose.

Inoltre, si ricorda che /opt/local/bin/python deve essere un link simbolico alla versione di Python si seleziona con port python select (verificare che con ls -l /opt/local/bin/python per essere sicuri).

+2

Vorrei sottolineare che l'utilizzo del flag -p è una soluzione se si dispone di terminali a più livelli che impediscono di impostare una variabile di ambiente (come ho). mkvirtualenv -p/usr/bin/python3 Foo – htmldrum

5

confermato l'uso di due variabili d'ambiente denominato allo stesso modo:

VIRTUALENVWRAPPER_PYTHON - quale versione di Python viene utilizzato dal programma di utilità virtualenvwrapper stesso.

VIRTUALENV_PYTHON - quale versione di Python verrà installata da virtualenv quando si crea un nuovo ambiente virtuale. Equivalente all'opzione -p/--python sulla riga di comando virtualenv.

E forse, ovviamente :) la versione di Python eseguita in un ambiente virtuale è la versione installata per esso - non ha alcuna relazione con le variabili di ambiente sopra descritte dopo la creazione dell'env.

Vedere https://stackoverflow.com/a/24724360/763269 per come aggiornare Python in un virtualenv.

6

Nessuno di questi ha funzionato. Ho installato Python3 per la prima volta quando ho installato la mia macchina osx, e pip e tutti i valori predefiniti.

In primo luogo, verificare che Python è stato installato:

$ `which python` -V 

Se questo restituisce "Pitone 2.7.12", quindi si è impostato per eseguire:

$ mkvirtualenv -p `which python` api_server 
Running virtualenv with interpreter /usr/local/bin/python 
New python executable in /Users/eric/.virtualenvs/api_server/bin/python2.7 
Also creating executable in /Users/eric/.virtualenvs/api_server/bin/python 
Installing setuptools, pip, wheel...done. 
virtualenvwrapper.user_scripts creating /Users/eric/.virtualenvs/api_server/bin/predeactivate 
virtualenvwrapper.user_scripts creating /Users/eric/.virtualenvs/api_server/bin/postdeactivate 
virtualenvwrapper.user_scripts creating /Users/eric/.virtualenvs/api_server/bin/preactivate 
virtualenvwrapper.user_scripts creating /Users/eric/.virtualenvs/api_server/bin/postactivate 
virtualenvwrapper.user_scripts creating /Users/eric/.virtualenvs/api_server/bin/get_env_details 

Questo sarà anche attivare il api_server workon, che modifica il tuo eseguibile python:

$ which python 
/Users/eric/.virtualenvs/api_server/bin/python 
$ python -V 
Python 2.7.12 

Che cosa significa which python effettivamente fare? Produce la directory degli eseguibili pitone trovato nel vostro PATH:

$ which python 
/usr/local/bin/python 

Utilizzando which python, si sono fondamentalmente passando /usr/local/bin/python all'opzione -p nella directory mkvirtualenv.

Cosa succede se è stato restituito più di un eseguibile python in which python? Basta trovare quello che si desidera e passarlo in:

$ mkvirtualenv -p /usr/local/bin/python3 api_server 

E virtualenvwrapper finirà utilizzando tale eseguibile python, invece.

Problemi correlati