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'environnement, puis fermer le sous-processus.
Je veux simplement activer le virtualenv et revenir au 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:
subprocess.Popen([venv_python_file, script_file])
:?script_file
partir d'un emplacement arbitraire, ou doit-il être dans levirtualenv
répertoire?script_file
n'a pas besoin d'être dans le répertoire virtualenv, cela peut être n'importe où.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 votre virtualenv comme ceci au début du script:
#!/path/to/project/venv/bin/python
Rendez le script exécutable:
Exécutez le script:
Voila!
la source
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 "." à la place, parce que j'ai lu qu'il vaut mieux l'utiliser que la 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')
Toute l'astuce réside dans l'
--rcfile
argument.Lorsque l'interpréteur Python se termine, il laisse le shell actuel dans l'environnement activé.
Gagner!
la source
os.system('/bin/bash --rcfile path/to/env/activate')
Vous savez, quand une instance de bash est lancée, elle prend .bashrc comme argument pour le --rcfile. Alors spécifiez simplement que le fichier rc est votre fichier d'activation ... Non?cat ~/.bashrc env/bin/activate > env/bin/activate2 && /bin/bash --rcfile env/bin/activate2
Pour exécuter un autre environnement Python selon la documentation officielle de Virtualenv , dans la ligne de commande, vous pouvez spécifier le chemin complet du binaire exécutable Python, juste cela (pas besoin d'activer le virtualenv avant):
Il en va de même si vous souhaitez appeler un script depuis la ligne de commande avec votre virtualenv. Vous n'avez pas besoin de l'activer avant:
Idem pour un environnement Windows (que ce soit depuis la ligne de commande ou depuis un script):
la source
Juste une solution simple qui fonctionne pour moi. Je ne sais pas pourquoi vous avez besoin du script Bash qui fait essentiellement une étape inutile (ai-je tort?)
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 l'environnement virtuel, il suffit de Ctrl+ Dou de quitter. Est-ce une solution possible ou n'est-ce pas ce que vous vouliez?
la source
L'environnement de processus enfant est perdu au moment où il cesse d'exister, et déplacer le contenu de l'environnement de là vers le parent est quelque peu délicat.
Vous devez probablement générer un script shell (vous pouvez en générer un dynamiquement vers / 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 analysez simplement le script d'activation en utilisant pour la ligne dans open ("bin / activate"), extrayez manuellement les éléments et mettez-les dans os.environ. C'est délicat, mais pas impossible.
la source
La meilleure 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 une alternative à execfile dans Python 3?
la source
Vous devez créer tous vos
virtualenv
s dans un dossier, tel quevirt
.En supposant que le nom de votre dossier virtualenv est virt, sinon changez-le
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 de script shell et collez les lignes ci-dessus ...
Accordez une autorisation exécutable à votre fichier:
Exportez maintenant ce chemin de dossier personnalisé afin que vous puissiez le trouver sur la ligne de commande en cliquant sur l'onglet ...
export PATH = $ PATH: "$ HOME / personnalisé"
Vous pouvez maintenant l'utiliser de n'importe où en tapant simplement la commande ci-dessous ...
Supposons que ce soit abc alors ...
la source