web-dev-qa-db-fra.com

Utilisation de différentes versions de python avec virtualenvwrapper

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

Mais si je sélectionne une autre version de python, c'est-à-dire 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 définit VIRTUALENVWRAPPER_PYTHON à /opt/local/bin/python, il me semble donc que virtualenvwrapper devrait fonctionner quel que soit python que j'ai sélectionné.

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

29
wmfox3

Je sais que cela est à peu près résolu dans vos commentaires, mais c'est uniquement sur mac,

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

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

En fait, vous pouvez même faire:

export VIRTUALENVWRAPPER_PYTHON=`which python`

Sur Linux, je fais cela dans mon .bashrc, donc dans l'ensemble, en supposant que vous avez installé virtualenv et créé votre premier "environnement virtuel" virtualenv (comment 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 au fait, vous avez écrit:

J'ai vérifié mon .profile et il définit VIRTUALENVWRAPPER_PYTHON sur/opt/local/bin/python, donc il me semble que virtualenvwrapper devrait fonctionner quel que soit python que j'ai sélectionné

ce qui est en fait le contraire - virtualenv s'appuie sur l'utilisation du bon python (et les packages qui vont avec)) il est donc 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!

29
Stefano

Rien de tout cela n'a fonctionné. J'ai installé Python3 d'abord lors de la configuration de ma machine osx, et pip et tous les paramètres par défaut.

Tout d'abord, vérifiez quel python vous avez installé:

$ `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 activera également le api_server workon, qui change votre python exécutable:

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

Qu'est-ce que which python en fait? Il affiche le répertoire des exécutables python trouvés dans votre PATH:

$ which python
/usr/local/bin/python

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

Que se passe-t-il lorsque vous avez plusieurs exécutables python renvoyés dans which python? Trouvez celui que vous voulez et passez-le:

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

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

17
eduncan911

Confirmé l'utilisation de deux variables d'environnement portant le même nom:

VIRTUALENVWRAPPER_PYTHON - dont Python est utilisée par l'utilitaire virtualenvwrapper lui-même. En d'autres termes, quelle version de Python exécute virtualenvwrapper, comme si cette version Python avait été explicitement nommée dans le #! ligne du fichier de script virtualenvwrapper.

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

Et peut-être évidemment :) la version de Python exécuté dans un environnement virtuel est la version que vous installez pour cet environnement - n'a aucune relation avec les variables d'environnement ci-dessus après la création de l'env.

Voir https://stackoverflow.com/a/24724360/763269 pour savoir comment mettre à niveau Python dans un virtualenv.

9
Chris Johnson

Vous pouvez sélectionner la version python explicitement

mkvirtualenv -p python3 venvname

ou

mkvirtualenv -p python2.7 venvname
8
Dos