J'ai vérifié le script activate et il me semble qu'il ne fait que:
Comment virtualenv
fournit-il cet environnement virtuel magique? Qu'est-ce que je manque?
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.
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.
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.. myenv/bin/activate
, qui définit la variable d'environnement PATH
du Shell pour commencer par myenv/bin.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.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