web-dev-qa-db-fra.com

Python questions virtualenv

J'utilise VirtualEnv sur Windows XP. Je me demande si mon cerveau s'enroule correctement:

Iran virtualenv ENV et il a créé C:\WINDOWS\system32\ENV. J'ai ensuite changé ma variable PATH pour inclure C:\WINDOWS\system32\ENV\Scripts au lieu de C:\Python27\Scripts. Ensuite, j'ai extrait Django into C:\WINDOWS\system32\ENV\Lib\site-packages\Django-trunk, a mis à jour mon PYTHON_PATH variable pour pointer le nouveau répertoire Django, et a continué à easy_install d'autres choses (qui bien sûr vont dans mon nouveau C:\WINDOWS\system32\ENV\Lib\site-packages répertoire).

Je comprends pourquoi je devrais utiliser VirtualEnv pour pouvoir exécuter plusieurs versions de Django et d'autres bibliothèques sur la même machine, mais cela signifie-t-il que pour basculer entre les environnements, je dois essentiellement changer mes PATH et PYTHON_PATH variable? Donc, je vais développer un Django projet qui utilise Django 1.2 dans un environnement appelé ENV puis changer mon PATH et tel que je puisse utiliser un environnement appelé ENV2 qui a la version dev de Django?

Est-ce fondamentalement ou existe-t-il une meilleure façon de faire automatiquement tout cela (je pourrais mettre à jour mon chemin d'accès en Python, mais cela nécessiterait que j'écrive du code spécifique à la machine dans mon application) ?

En outre, comment ce processus se compare-t-il à l'utilisation de VirtualEnv sur Linux (je suis tout à fait un débutant sous Linux).

50
orokusaki

Normalement, virtualenv crée des environnements dans le répertoire courant. Sauf si vous avez l'intention de créer des environnements virtuels dans C:\Windows\system32 pour une raison quelconque, j'utiliserais un répertoire différent pour les environnements.

Vous ne devriez pas avoir besoin de jouer avec les chemins: utilisez le script activate (dans <env>\Scripts) pour garantir que l'exécutable et le chemin d'accès Python sont spécifiques à l'environnement. Une fois que vous avez fait cela, l'invite de commande change pour indiquer l'environnement. Vous pouvez alors simplement appeler easy_install et tout ce que vous voulez installer de cette façon sera installé dans cet environnement. Utilisez deactivate pour tout remettre en l'état avant l'activation.

Exemple:

c:\Temp>virtualenv myenv
New python executable in myenv\Scripts\python.exe
Installing setuptools..................done.
c:\Temp>myenv\Scripts\activate
(myenv) C:\Temp>deactivate
C:\Temp>

Remarquez comment je n'ai pas eu besoin de spécifier un chemin pour deactivate - activate le fait pour vous, de sorte que lorsqu'il est activé, "Python" exécutera le Python dans virtualenv, pas dans votre système Python. (Essayez-le - faites un import sys; sys.prefix et il devrait imprimer la racine de votre environnement.)

Vous pouvez simplement activer un nouvel environnement pour basculer entre les environnements/projets, mais vous devrez spécifier le chemin complet pour activate afin qu'il sache quel environnement activer. Vous ne devriez jamais avoir besoin de jouer explicitement avec PATH ou PYTHONPATH.

Si vous utilisez Windows Powershell, vous pouvez profiter d'un wrapper . Sous Linux, le virtualenvwrapper (le lien pointe vers un port de celui-ci vers Powershell) rend la vie avec virtualenv encore plus facile.

Mise à jour: Pas incorrect, exactement, mais peut-être pas tout à fait dans l'esprit de virtualenv. Vous pouvez adopter une approche différente: par exemple, si vous installez Django et tout ce dont vous avez besoin pour votre site dans votre virtualenv, alors vous pouvez travailler dans le répertoire de votre projet (où vous développez votre site) avec virtualenv activé. Parce qu'il a été activé, votre Python trouverait Django et tout ce que vous auriez facilement_installé dans l'environnement virtuel: et parce que vous 'travaillez dans votre répertoire de projet, vos fichiers de projet seraient également visibles pour Python.

Mise à jour supplémentaire: Vous devriez pouvoir utiliser pip, distribute au lieu de setuptools, et tout simplement python setup.py install avec virtualenv. Assurez-vous simplement d'avoir activé un environnement avant d'y installer quelque chose.

93
Vinay Sajip

Oui, fondamentalement, c'est ce que fait virtualenv, et c'est à cela que sert la commande activate, à partir du doc ​​ ici :

activer le script

Dans un virtualenv nouvellement créé, il y aura un script shell bin/activate ou un fichier batch Scripts/activate.bat sous Windows.

Cela changera votre $ PATH pour pointer vers le répertoire bin/virtualenv. Contrairement à workingenv, c'est tout ce qu'il fait; c'est une commodité. Mais si vous utilisez le chemin complet comme/path/to/env/bin/python script.py, vous n'avez pas besoin d'activer l'environnement en premier. Vous devez utiliser la source car elle modifie l'environnement sur place. Après avoir activé un environnement, vous pouvez utiliser la fonction désactiver pour annuler les modifications.

Le script d'activation modifiera également votre invite de shell pour indiquer quel environnement est actuellement actif.

vous devez donc simplement utiliser la commande activate qui fera tout cela pour vous:

> \path\to\env\bin\activate.bat
6
mouad

sous Windows, j'ai python 3.7 installé et je ne pouvais toujours pas activer virtualenv depuis Gitbash avec ./Scripts/activate même si cela fonctionnait depuis Powershell après avoir exécuté Set-ExecutionPolicy Unrestricted dans Powershell et en modifiant le paramètre sur "Oui à tous".

Je n'aime pas Powershell et j'aime utiliser Gitbash, donc pour activer virtualenv dans Gitbash, accédez d'abord à votre dossier de projet, utilisez ls pour lister le contenu du dossier et assurez-vous de voir "Scripts". Changez le répertoire en "Scripts" en utilisant cd Scripts, une fois dans le chemin "Scripts", utilisez . activate pour activer virtualenv. N'oubliez pas l'espace après le point.

2
Presh Onyee

dans mon fichier de projet wsgi.py j'ai ce code (il fonctionne avec virtualenv, Django, Apache2 dans windows et python 3.4)

import os
import sys
Django_PATH = os.path.join(os.path.abspath(os.path.dirname(__file__)),'..')
sys.path.append(Django_PATH)
sys.path.append('c:/myproject/env/Scripts')
sys.path.append('c:/myproject/env/Lib/site-packages')
activate_this = 'c:/myproject/env/scripts/activate_this.py'
exec(open(activate_this).read())
from Django.core.wsgi import get_wsgi_application
os.environ.setdefault("Django_SETTINGS_MODULE", "myproject.settings")
application = get_wsgi_application()

dans le fichier virtualhost conf j'ai

<VirtualHost *:80>
    ServerName mysite
    WSGIScriptAlias / c:/myproject/myproject/myproject/wsgi.py
    DocumentRoot c:/myproject/myproject/
    <Directory  "c:/myproject/myproject/myproject/">
       Options +Indexes +FollowSymLinks +MultiViews
       AllowOverride All
      Require local
   </Directory>
</VirtualHost>
0