Je cherche un bon moyen de comprendre le nom de l'environnement conda dans lequel je me trouve à partir du code en cours d'exécution ou d'une instance interactive python.
Le cas d'utilisation est que j'exécute des blocs-notes Jupyter avec les deux Python 2 et Python 3 noyaux d'une installation miniconda. L'environnement par défaut est Py3. Il y a un environnement séparé pour Py2. Dans un fichier de bloc-notes, je veux qu'il essaie de conda install foo
. J'utilise subcommand
pour le faire pour l'instant, car je ne trouve pas de conda programmatique équivalent de pip.main(['install','foo'])
.
Le problème est que la commande a besoin de connaître le nom de l'environnement Py2 pour y installer foo
si le portable fonctionne avec le noyau Py2. Sans ces informations, il s'installe dans l'environnement Py3 par défaut. J'aimerais que le code détermine dans quel environnement il se trouve et le bon nom pour lui-même.
La meilleure solution que j'ai jusqu'à présent est:
import sys
def get_env():
sp = sys.path[1].split("/")
if "envs" in sp:
return sp[sp.index("envs") + 1]
else:
return ""
Existe-t-il un moyen plus direct/approprié pour y parvenir?
Tu veux $CONDA_DEFAULT_ENV
ou $CONDA_PREFIX
:
$ source activate my_env
(my_env) $ echo $CONDA_DEFAULT_ENV
my_env
(my_env) $ echo $CONDA_PREFIX
/Users/nhdaly/miniconda3/envs/my_env
$ source deactivate
$ echo $CONDA_DEFAULT_ENV # (not-defined)
$ echo $CONDA_PREFIX # (not-defined)
En python:
In [1]: import os
...: print os.environ['CONDA_DEFAULT_ENV']
...:
my_env
Les variables d'environnement ne sont pas bien documentées. Tu peux trouver CONDA_DEFAULT_ENV
mentionné ici: https://www.continuum.io/blog/developer/advanced-features-conda-part-1
La seule info sur CONDA_PREFIX
J'ai pu trouver ce problème: https://github.com/conda/conda/issues/2764
J'utilise ceci:
import sys
sys.executable.split('/')[-3]
il a l'avantage de ne pas supposer que l'env est dans le chemin (et est imbriqué sous envs
). De plus, il ne nécessite pas que l'environnement soit activé via source activate
.
Modifier: si vous voulez vous assurer que cela fonctionne également sur Windows:
import sys
from pathlib import Path
Path(sys.executable).as_posix().split('/')[-3]
Clarifier: sys.executable
vous donne le chemin de l'interpréteur actuel python (indépendamment de l'activation/désactivation) - par exemple '/Users/danielsc/miniconda3/envs/nlp/bin/python'
. Le reste du code ne prend que le 3ème du dernier segment de chemin, qui est le nom du dossier dans lequel se trouve l'environnement, qui est généralement aussi le nom de l'environnement python.
très simplement, vous pourriez faire
envs = subprocess.check_output('conda env list').splitlines()
active_env = list(filter(lambda s: '*' in str(s), envs))[0]
env_name = str(active_env).split()[0]
Edit: Oups, je n'avais pas remarqué la réponse de Ivo . Disons que je m'étends un peu là-dessus.
Si vous exécutez votre script python à partir du terminal:
import os
os.system("conda env list")
Cela listera tous les environnements conda, à partir du terminal avec conda env list
.
Un peu mieux:
import os
_ = os.system("conda env list | grep '*'")
Le bit _ =
Fera taire l'état existant de l'appel à os.system
(0
En cas de succès), et grep
imprimera uniquement la ligne avec l'activation environnement conda.
Si vous n'exécutez pas votre script à partir du terminal (par exemple, il est planifié via crontab
), alors ce qui précède n'aura aucun endroit pour "imprimer" le résultat. À la place, vous devez utiliser quelque chose comme le module subprocess
de python. La solution la plus simple est probablement d'exécuter:
import subprocess
output = subprocess.check_output("conda env list | grep '*'", Shell=True, encoding='utf-8')
print(output)
A savoir output
est une chaîne contenant la sortie de la commande conda env list
, Pas son état de sortie (qui peut également être récupéré, voir la documentation de la subprocess
module).
Maintenant que vous disposez d'une chaîne contenant les informations sur l'environnement conda activé, vous pouvez effectuer le test dont vous avez besoin (à l'aide d'expressions régulières) pour effectuer (ou non) les installations mentionnées dans votre question.
Remarque.
Bien sûr, print(output)
dans le bloc ci-dessus n'aura aucun effet si votre script n'est pas exécuté à partir du terminal, mais si vous testez le bloc dans un script que vous exécutez à partir du terminal, alors vous pouvez vérifiez qu'il vous donne ce que vous voulez. Vous pouvez par exemple imprimer ces informations dans un fichier journal (l'utilisation du module logging
est recommandée).
Étant donné que des recherches similaires liées à "comment puis-je déterminer mon environnement python environnement" conduisent à cette réponse, j'ai pensé que je mentionnerai également un moyen de savoir de quel environnement j'utilise actuellement mon code. Je vérifie l'emplacement de mon pip binaire qui pointe vers un emplacement dans le environnement actuel. En regardant la sortie de la commande suivante, vous pouvez facilement déterminer dans quel environnement vous vous trouvez. (Veuillez noter que cette solution n'est pas applicable si vous avez hérité des packages pip de votre environnement global/autre environnement)
Dans Invite de commandes Windows :
where pip
Si vous êtes dans un Jupyter Notebook ajoutez un point d'exclamation (!) Avant la commande pour exécuter la commande dans votre invite de commande hôte:
in[10]: !where pip
La sortie ressemblera à ceci:
C:\Users\YourUsername\.conda\envs\YourEnvironmentName\Scripts\pip.exe
C:\ProgramData\Anaconda3\Scripts\pip.exe
YourEnvironmentName donne le nom de votre environnement actuel.
Dans Linux/Mac , vous pouvez utiliser la commande which au lieu de where: (Non testé).
Pour l'environnement python3
which pip3
Depuis Carnet Jupyter :
in[10]: !which pip3
Cela devrait pointer directement vers l'emplacement dans votre environnement actuel.
Sous Windows (peut fonctionner mais n'a pas été testé sous Linux):
import sys
import os
# e.g. c:\Users\dogbert\Anaconda3\envs\myenvironment
print( sys.exec_prefix.split(os.sep)[-1] )
Les réponses utilisant des variables d'environnement ou supposant que le séparateur de chemin est "/" ne fonctionnaient pas dans mon environnement Windows/Anaconda3.
Cela suppose que vous êtes dans un environnement.