web-dev-qa-db-fra.com

Activer une virtualenv avec un script python

Je souhaite activer une instance de virtualenv à partir d'un script python.

Je sais que c'est assez facile à faire, mais tous les exemples que j'ai vus l'utilisent pour exécuter des commandes dans env et ensuite fermer le sous-processus.

Ce que je veux, c’est tout simplement d’activer virtualenv et de retourner dans le shell, de la même manière que bin/activate.

Quelque chose comme ça:

$me: my-script.py -d env-name
$(env-name)me: 

Est-ce possible ?

Pertinent:

http://groups.google.com/group/python-virtualenv/browse_thread/thread/15f8a9b0506abeae

71
h3.

Si vous souhaitez exécuter un sous-processus Python sous virtualenv, vous pouvez le faire en exécutant le script à l'aide de l'interpréteur python situé dans le répertoire/bin/de virtualenv:

# path to a python interpreter that runs any python script
# under the virtualenv /path/to/virtualenv/
python_bin = "/path/to/virtualenv/bin/python"

# path to the script that must run under the virtualenv
script_file = "must/run/under/virtualenv/script.py"

subprocess.Popen([python_bin, script_file])

Toutefois, si vous souhaitez activer virtualenv sous l'interpréteur python actuel au lieu d'un sous-processus, vous pouvez utiliser le script activate_this.py:

# doing execfile() on this file will alter the current interpreter's
# environment so you can import libraries in the virtualenv
activate_this_file = "/path/to/virtualenv/bin/activate_this.py"

execfile(activate_this_file, dict(__file__=activate_this_file))
64
Lie Ryan

La solution la plus simple pour exécuter votre script sous l'interpréteur de virtualenv consiste à remplacer la ligne Shebang par défaut par le chemin d'accès à l'interpréteur de virtualenv, comme au début du script:

#!/path/to/project/venv/bin/python

Rendre le script exécutable: 

chmod u+x script.py

Exécutez le script:

./script.py

Voila!

19
nafooesi

Il s'avère que oui, le problème n'est pas simple, mais la solution l'est.

J'ai d'abord dû créer un script shell pour envelopper la commande "source". Cela dit j'ai utilisé le "." parce que j'ai lu qu'il vaut mieux l'utiliser que le source pour les scripts bash.

#!/bin/bash
. /path/to/env/bin/activate

Ensuite, à partir de mon script python, je peux simplement faire ceci:

import os
os.system('/bin/bash --rcfile /path/to/myscript.sh')

L'astuce réside dans l'argument --rcfile.

Lorsque l'interpréteur python se ferme, il laisse le shell actuel dans l'environnement activé.

Gagner!

18
h3.

Pour exécuter un autre environnement Python conformément à la documentation officielle de Virtualenv , dans la ligne de commande, vous pouvez spécifier le chemin complet du binaire exécutable Python.

/path/to/virtualenv/bin/python

La même chose s'applique si vous voulez appeler un script depuis la ligne de commande avec votre virtualenv, vous n'avez pas besoin de l'activer auparavant:

me$ /path/to/virtualenv/bin/python myscript.py

Idem pour l’environnement Windows (qu’il s’agisse de la ligne de commande ou d’un script):

> \path\to\env\Scripts\python.exe myscript.py
6
Mariano Ruiz

Juste une solution simple qui fonctionne pour moi. Je ne sais pas pourquoi vous avez besoin du script bash qui fait un pas inutile (est-ce que je me trompe?) 

import os
os.system('/bin/bash  --rcfile flask/bin/activate')

Ce qui fait essentiellement ce dont vous avez besoin: 

[hellsing@silence Foundation]$ python2.7 pythonvenv.py 
(flask)[hellsing@silence Foundation]$ 

Ensuite, au lieu de désactiver venv, il suffit de Ctrl + D ou de quitter.
Est-ce une solution possible ou n'est-ce pas ce que vous vouliez?

5
Depado

Le processus enfant env est perdu au moment où il cesse d'exister et déplacer le contenu de l'environnement de là vers le rôle parent est quelque peu délicat.

Ce que vous devez probablement faire est de générer un script Shell (vous pouvez en générer un dynamiquement dans/tmp) qui générera les variables d’environnement virtualenv dans un fichier, que vous lirez ensuite dans le processus Python parent et placerez dans os.environ.

Ou vous analysez simplement activer le script en utilisant for for line in open ("bin/activate") et extrayez manuellement les éléments et mettez-les sur os.environ. Difficile, mais pas impossible.

2
Mikko Ohtamaa

La meilleure réponse ne fonctionne que pour python2.x

Pour Python 3.x, utilisez ceci.

activate_this_file = "/path/to/virtualenv/bin/activate_this.py"

exec(compile(open(activate_this_file, "rb").read(), activate_this_file, 'exec'), dict(__file__=activate_this_file))

reference: Quelle est une alternative à execfile dans Python 3?

0
Asaad