web-dev-qa-db-fra.com

Comment trouver le nom de l'environnement conda dans lequel mon code s'exécute?

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?

20
Alnilam

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

44
NHDaly

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.

3
Daniel Schneider

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]
2
Ivo

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

1
Antoine

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

1
codeslord

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.

0
MZB