Question

J'écris un script shell basé sur Python à BOILERPLATE une application Django avec virtualenv, pépin, et le tissu. Devrait être assez simple, mais il semble que je ne suis pas capable d'activer et exécuter des commandes dans le virtualenv par le script shell.

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 n'est pas en cours d'exécution, mais pourquoi? Est-ce un problème concurrency / filetage, ou quelque chose de plus profond avec virtualenv?

Merci!

Était-ce utile?

La solution

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

Autres conseils

Chaque appel à os.system exécute la commande dans une nouvelle sous-shell, qui a les mêmes propriétés que le processus de python d'origine.

Essayer de mettre les commandes dans une chaîne séparée par des points virgules.

Il suffit de ne pas utiliser « source active » du tout. Il ne fait que modifier votre PATH shell pour mettre d'abord le répertoire bin du virtualenv. 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 chemin complet. Ou _virtualenv_dir_ / bin / python pour exécuter un autre script python dans le virtualenv.

Vous pouvez également installer virtualenvwrapper et utilisez le crochet postmkvirtualenv. Je l'utilise pour mettre automatiquement des copies fraîches de pépin et IPython dans virtualenvs je crée (comme je ne veux pas utiliser mon système IPython). Je l'utilise aussi pour copier pythonw dans le virtualenv, sinon des choses à base WX ne fonctionnera pas. On dirait ceci:

easy_install pip
pip install -I ipython
cd ~/bin
python install_pythonw.py ${VIRTUAL_ENV}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top