2011-06-19 4 views
18

Plusieurs versions de python sont installées sur Mac en utilisant Macports. Quand j'ai sélectionné python 2.7 via $ port select python python27, virtualenvwrapper fonctionne parfaitement.Utilisation de différentes versions de python avec virtualenvwrapper

Mais si je sélectionne une autre version de python, soit 2,6, virtualenvwrapper génère un message d'erreur: ImportError: Aucun module nommé virtualenvwrapper.hook_loader

J'ai vérifié mon .profile et il est la mise VIRTUALENVWRAPPER_PYTHON-/opt/local/bin/python, il semble moi virtualenvwrapper devrait fonctionner quel que soit le python que j'ai choisi.

Une idée de ce qui causerait virtualenvwrapper pour générer une erreur .hook_loader lorsque je change de version python?

+8

Sans passer par '' sélectionnez le port ... et coller avec votre base 2.7, ne peut lancer 'mkvirtualenv --python/chemin/vers/travail python2.6'? Il devrait automatiquement basculer vers (et configurer l'environnement avec) l'interpréteur correct. Sur mon système (mis en place avec homebrew), 'mkvirtualenv -p python2.6' fonctionne très bien. –

+0

Je ne reçois pas l'erreur hook_loader, mais il se plaint de l'absence de DEST_DIR $ mkvirtualenv --python /opt/local/bin/python2.7 Exécution de virtualenv avec l'interpréteur /opt/local/bin/python2.7 Vous devez fournir un DEST_DIR – wmfox3

+1

Oups, désolé - laissé de côté l'argument clé! Cela devrait être 'mkvirtualenv --python /path/to/python2.6 env_name'. mkvirtualenv crée un dossier appelé "nom_env" dans votre $ WORKON_HOME, qui est transmis à virtualenv en tant qu'argument "DEST_DIR". Sans préciser de nom, il serait difficile de déterminer où mettre les choses en place, c'est certain. –

Répondre

19

Je sais que cela est à peu près résolu dans vos commentaires, mais il est Mac uniquement,

et encore plus je pense que devrait être la bonne façon de mettre VIRTUALENVWRAPPER_PYTHON au python réel que vous utilisez sur la ligne de commande.

Pour être sûr que vous pouvez faire which python.

En fait, vous pouvez le faire même:

export VIRTUALENVWRAPPER_PYTHON=`which python` 

Sur Linux, je le fais dans mon .bashrc, donc dans l'ensemble, en supposant installé virtualenv et créé votre premier « environnement virtuel » virtualenv (comment l'original)

. 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 

(et par la manière, vous avez écrit:

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 est en réalité le contraire - virtualenv repose sur l'utilisation du bon python (et des paquets qui vont avec) donc il est très important de définir le chemin python en conséquence.

Même l'exécution d'un fichier py avec un "#!/Bin/python" peut causer des problèmes une fois que vous êtes virtualenved!

+4

Exécution de quelques tests sur mon Mac - il semble que 'VIRTUALENVWRAPPER_PYTHON' contrôle uniquement quel exécutable Python est utilisé par 'virtualenvwrapper' lui-même, pas l'exécutable qui est installé dans l'environnement virtuel, par exemple. lorsque vous exécutez 'mkproject'. J'aurais aimé me tromper mais jusqu'ici il semble que la seule façon de choisir une version différente de Python est d'utiliser '-p/--python' dans la ligne de commande' virtualenvwrapper'. Si c'est vrai, c'est un peu dommage. –

+0

@ChrisJohnson mmmh depuis lors j'ai arrêté d'utiliser virtualenvwrapper - je n'en ai plus vraiment besoin - je n'ai aucun moyen facile de vérifier rapidement, mais vous pourriez bien avoir raison ... Aussi sur MAC j'utilise maintenant ... – Stefano

+0

comme @ChrisJohnson sur Ubuntu. avait mon 'VIRTUALENVWRAPPER_PYTHON' mis à python2, mais' mkvirtualenv' créait virtualenvs avec python3. –

-1

Vous (l'OP) semble avoir installé virtualenv et virtualenvwrapper avec python2.7, et non avec python2.6. Si python2.6 est appelé au moment où votre shell charge le script virtualenvwrapper.sh, il est mécontent. Assez simple.

VIRTUALENVWRAPPER_PYTHON est faite pour ces situations. Avec elle, vous pouvez vous assurer d'utiliser toujours la bonne version de python, et ne pas ajouter toujours -p /path/to/python2.7

Donc, je ne suis pas d'accord avec la réponse de Stefano dans ce cas, dans la situation de l'OP, vous aurait dû expliquer clairement dans votre .bashrc qui python à utiliser:

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

comme ça, il devrait être ok tout le temps! Virtualenvwrapper est fait pour simplifier les choses.

En outre, s'il vous plaît noter que /opt/local/bin/python doit être un lien symbolique à la version de python vous sélectionnez avec port python select (vérifiez que avec ls -l /opt/local/bin/python pour être sûr).

+2

Je voudrais souligner que l'utilisation de l'option -p est une solution si vous avez des terminaux en couches qui vous empêchent de définir une variable d'environnement (comme je l'ai fait). mkvirtualenv -p/usr/bin/python3 Foo – htmldrum

5

a confirmé l'utilisation de deux variables d'environnement du même nom:

VIRTUALENVWRAPPER_PYTHON - version Python est utilisé par l'utilitaire de virtualenvwrapper lui-même.

VIRTUALENV_PYTHON - quelle version de Python sera installée par virtualenv lorsque vous créez un nouvel environnement virtuel. Équivalent à l'option -p/--python sur la ligne de commande virtualenv.

Et peut-être :) évidemment la version de Python run dans un environnement virtuel est la version que vous avez installé pour elle - n'a aucun rapport avec les variables d'environnement ci-dessus après env est créé.

Voir https://stackoverflow.com/a/24724360/763269 pour la mise à niveau Python dans un virtualenv.

6

Aucune d'entre elles n'a fonctionné. J'ai d'abord installé Python3 lors de la configuration de ma machine osx, et pip et tout le reste par défaut.

d'abord, vérifiez que vous avez installé Python:

$ `which python` -V 

Si cela retourne "Python 2.7.12", alors vous êtes prêt à exécuter:

$ 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 

Cela permettra également d'activer le api_server WorkOn, qui change votre exécutable python:

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

Qu'est-ce which python fait réellement? Il sort le répertoire des exécutables python se trouvent dans votre PATH:

$ which python 
/usr/local/bin/python 

En utilisant which python, vous passez essentiellement dans /usr/local/bin/python à l'option -p dans le répertoire mkvirtualenv.

Qu'est-ce qui se passe quand vous avez plus d'un exécutable python retourné dans which python? Il suffit de trouver celui que vous voulez et le transmettre dans:

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

Et virtualenvwrapper finira par utiliser l'exécutable python à la place.

Questions connexes