web-dev-qa-db-fra.com

Comment fonctionne virtualenv?

J'ai vérifié le script activate et il me semble qu'il ne fait que:

  • définir VIRTUAL_ENV env
  • ajouter $ VIRTUAL_ENV/bin devant PATH

Comment virtualenv fournit-il cet environnement virtuel magique? Qu'est-ce que je manque?

53
Drake Guan

Je décrirai le processus de base, que j'ai appris de la présentation @jcollado liée.

Lorsque Python démarre, il regarde le chemin du binaire et ses préfixes.

Supposons donc que votre virtualenv soit /home/blah/scratch. Le processus Python sait qu'il a été exécuté à partir de /home/blah/scratch/bin/python (qui n'est généralement qu'une copie de votre système python binaire /usr/bin/python) et il connaît sa propre version X.Y parce qu'il y est compilé. Alors Python recherche lib/pythonX.Y/os.py dans cet ordre:

/home/blah/scratch/bin/lib/pythonX.Y/os.py
/home/blah/scratch/lib/pythonX.Y/os.py    <-- this file should exist
/home/blah/lib/pythonX.Y/os.py
/home/lib/pythonX.Y/os.py
/lib/pythonX.Y/os.py

Il s'arrête à /home/blah/scratch/lib/pythonX.Y/os.py car c'est le premier fichier qui existe réellement. Si ce n'est pas le cas, Python continuera à chercher. Il définit ensuite sys.prefix basé sur ceci. Il utilise un processus similaire pour définir sys.exec_prefix, puis sys.path est construit à partir de ceux-ci.

51
Max

C'est un très bon présentation sur le sujet. Fondamentalement, il explique les étapes pour écrire votre propre virtualenv avec les mêmes astuces utilisées par Ian Bicking pour l'écrire.

24
jcollado
  1. L'utilisateur crée d'abord un nouveau virtualenv avec la commande virtualenv myenv. Cela crée un répertoire appelé myenv et copie le système python binaire dans myenv/bin. Il ajoute également d'autres fichiers et répertoires nécessaires à - myenv, y compris un script d'installation dans bin/activate et un sous-répertoire lib pour les modules et les packages.
  2. Ensuite, l'utilisateur source le script d'activation avec . myenv/bin/activate, qui définit la variable d'environnement PATH du Shell pour commencer par myenv/bin.
  3. Maintenant, lorsque l'utilisateur exécute python à partir de ce shell, il exécutera la copie du binaire stocké dans myenv/bin. Même si le binaire est identique à celui de/usr/bin/python, le binaire standard python est conçu pour rechercher des packages et des modules dans des répertoires relatifs au chemin du binaire (cette fonctionnalité n'est pas lié à virtualenv.) Il regarde dans ../ lib/pythonX.Y où X et Y sont les numéros de version majeurs et mineurs du binaire python binaire). Alors maintenant, il cherche dans myenv/lib/pythonX.Y.
  4. Le répertoire myenv/bin contient également un script nommé pip de sorte que lorsque l'utilisateur installe de nouveaux packages à l'aide de pip à partir de virtualenv, ils seront installés dans myenv/lib/pythonX.Y
13
clark800