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._

116voto

Lie Ryan Points 24517

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

import subprocess

# 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])

Cependant, si vous souhaitez activer la virtualenv sous l'interpréteur Python actuel au lieu d'un sous-processus, vous pouvez utiliser l'option activate_this.py script :

# 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))

74voto

nafooesi Points 356

La solution la plus simple pour exécuter votre script sous l'interpréteur de virtualenv est de remplacer la ligne shebang par défaut par le chemin vers l'interpréteur de virtualenv comme ceci au début du script :

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

Rendez le script exécutable :

chmod u+x script.py

Exécutez le script :

./script.py

Voilà !

25voto

h3. Points 2202

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

J'ai d'abord dû créer un script shell script pour envelopper la commande "source". Cela dit, j'ai utilisé le "." à la place, car j'ai lu qu'il est préférable de l'utiliser plutôt que source pour les script 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')

Toute l'astuce réside dans la --rcfile argument.

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

Gagnez !

24voto

Mrdev Points 21

Pour exécuter un autre environnement Python conformément à la version officielle de Documentation de Virtualenv Dans la ligne de commande, vous pouvez spécifier le chemin complet vers le binaire Python exécutable, juste cela (pas besoin d'activer le virtualenv avant) :

/path/to/virtualenv/bin/python

Il en va de même si vous souhaitez invoquer un script à partir de la ligne de commande avec votre virtualenv. Il n'est pas nécessaire de l'activer au préalable :

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

Il en va de même pour un environnement Windows (que ce soit à partir de la ligne de commande ou d'un script) :

> \path\to\env\Scripts\python.exe myscript.py

8voto

Depado Points 507

Il s'agit d'une solution simple qui fonctionne pour moi. Je ne sais pas pourquoi vous avez besoin du Bash script qui fait en fait une étape inutile (est-ce que je me trompe ?).

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

Ce qui, en gros, fait ce dont vous avez besoin :

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

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

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