125 votes

Activer une virtualenv avec un script Python

Je souhaite activer une instance 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 l'env et ensuite fermer le sous-processus.

Je veux simplement activer le virtualenv et revenir au shell, de la même manière que bin/activate.

Voici ce qu'il en est :

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

Est-ce possible ?

Pertinent :

_virtualenv ' Invoquer un environnement à partir d'un script._

7voto

Asaad Points 31

La première réponse ne fonctionne que pour Python 2.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))

Référence : Quelle est l'alternative à execfile dans Python 3 ?

2voto

Mikko Ohtamaa Points 20940

L'environnement du processus enfant est perdu au moment où il cesse d'exister, et le transfert du contenu de l'environnement vers le processus parent est quelque peu délicat.

Vous devez probablement créer un shell script (vous pouvez en générer un dynamiquement dans /tmp) qui affichera les variables d'environnement virtualenv dans un fichier, que vous lirez ensuite dans le processus Python parent et que vous placerez dans os.environ.

Ou vous pouvez simplement analyser le script d'activation en utilisant la ligne dans open("bin/activate"), extraire manuellement des choses, et les mettre dans os.environ. C'est délicat, mais pas impossible.

1voto

Pour python2/3, l'extrait de code ci-dessous permet d'activer l'environnement virtuel.

activate_this = "/home/<--path-->/<--virtual env name -->/bin/activate_this.py" #for ubuntu
activate_this = "D:\<-- path -->\<--virtual env name -->\Scripts\\activate_this.py" #for windows
with open(activate_this) as f:
    code = compile(f.read(), activate_this, 'exec')
    exec(code, dict(__file__=activate_this))

1voto

rahul_5409 Points 31

J'ai eu le même problème et il n'y avait pas de activate_this.py en el Scripts de mon environnement.

activate_this.py

"""By using execfile(this_file, dict(__file__=this_file)) you will
activate this virtualenv environment.
This can be used when you must use an existing Python interpreter, not
the virtualenv bin/python
"""

try:
    __file__
except NameError:
    raise AssertionError(
        "You must run this like execfile('path/to/active_this.py', dict(__file__='path/to/activate_this.py'))")
import sys
import os

base = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
if(sys.platform=='win32'):
     site_packages = os.path.join(base, 'Lib', 'site-packages')
else:
     site_packages = os.path.join(base, 'lib', 'python%s' % sys.version[:3], 'site-packages')
prev_sys_path = list(sys.path)
import site
site.addsitedir(site_packages)
sys.real_prefix = sys.prefix
sys.prefix = base
# Move the added items to the front of the path:
new_sys_path = []
for item in list(sys.path):
    if item not in prev_sys_path:
        new_sys_path.append(item)
        sys.path.remove(item)
sys.path[:0] = new_sys_path

Copier le fichier dans le Scripts de votre environnement et utilisez-le comme suit :

def activate_virtual_environment(environment_root):
    """Configures the virtual environment starting at ``environment_root``."""
    activate_script = os.path.join(
        environment_root, 'Scripts', 'activate_this.py')
    execfile(activate_script, {'__file__': activate_script})

activate_virtual_environment('path/to/your/venv')

Référence : https://github.com/dcreager/virtualenv/blob/master/virtualenv_support/activate_this.py

-1voto

SR_Mehta Points 18

Vous devez créer tous vos virtualenv dans un dossier, par exemple virt .

En supposant que le nom de votre dossier virtualenv est virt, si ce n'est pas le cas, changez-le.

cd
mkdir custom

Copiez les lignes ci-dessous...

#!/usr/bin/env bash
ENV_PATH="$HOME/virt/$1/bin/activate"
bash --rcfile $ENV_PATH -i

Créez un fichier shell script et collez les lignes ci-dessus...

touch custom/vhelper
nano custom/vhelper

Accorder l'autorisation d'exécution à votre fichier :

sudo chmod +x custom/vhelper

Exportez maintenant ce chemin de dossier personnalisé afin de pouvoir le retrouver sur la ligne de commande en cliquant sur tab...

export PATH=$PATH : "$HOME/custom"

Vous pouvez désormais l'utiliser de n'importe où en tapant simplement la commande suivante...

vhelper YOUR_VIRTUAL_ENV_FOLDER_NAME

Supposons qu'il s'agisse d'abc, alors...

vhelper abc

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X