2009-11-06 4 views
4

J'écris un script shell basé sur Python pour passer une application Django avec virtualenv, pip et fabric. Cela devrait être assez simple, mais il semble que je ne suis pas capable d'activer et d'exécuter des commandes dans virtualenv via le script shell.Activer virtualenv via os.system()

os.system('virtualenv %s --no-site-packages' % project_name) 
os.system('source %s/bin/activate' % project_name) 
os.system('easy_install pip') 

Lors de l'exécution, cette erreur sur:

$ startproject+ -s false sample 
New python executable in sample/bin/python 
Installing setuptools............done. 
/testing 
Searching for pip 
Best match: pip 0.4 
Processing pip-0.4-py2.6.egg 
pip 0.4 is already the active version in easy-install.pth 
Installing pip script to /usr/local/bin 
error: /usr/local/bin/pip: Permission denied 

Il est évident que la ligne source ne sont pas en cours d'exécution, mais pourquoi? Est-ce un problème de concurrence/threading, ou quelque chose de plus profond avec virtualenv?

Merci!

Répondre

3

Chaque appel os.system crée un nouveau processus. Vous devez vous assurer que le activate et le easy_install sont exécutés dans le même appel os.system ou subprocess.

11

Chaque appel à os.system exécute la commande dans un nouveau sous-shell, qui a les mêmes propriétés que le processus python d'origine. Essayez de placer les commandes dans une chaîne séparée par des points-virgules.

+0

Doh! Merci pour l'aide! –

3

Vous pouvez également installer virtualenvwrapper et utiliser le hook postmkvirtualenv. Je l'utilise pour apporter automatiquement de nouvelles copies de pip et IPython dans virtualenvs que je crée (comme je ne le veux pas en utilisant mon système IPython). Je l'utilise aussi pour copier pythonw dans virtualenv, sinon les trucs basés sur wx ne fonctionneront pas. Ressemble à ceci:

easy_install pip 
pip install -I ipython 
cd ~/bin 
python install_pythonw.py ${VIRTUAL_ENV} 
4

N'utilisez tout simplement pas "source activate". Il ne fait que modifier votre shell PATH pour placer le répertoire bin de virtualenv en premier. Je suppose que votre script connaît le répertoire du virtualenv qu'il vient de créer; tout ce que vous avez à faire est d'appeler _virtualenv_dir_/bin/easy_install par le chemin complet. Ou _virtualenv_dir_/bin/python pour exécuter tout autre script python dans virtualenv.