web-dev-qa-db-fra.com

Comment définir la variable env dans le cahier Jupyter

Jupyter ne voit pas la variable env dans le fichier bashrc. Existe-t-il un moyen de charger ces variables dans jupyter ou d’y ajouter une variable custome?

26
Ehab AlBadawy

Pour définir une variable env dans un bloc-notes jupyter, utilisez simplement une commande magique %, soit %env ou %set_env, par exemple %env MY_VAR=MY_VALUE ou %env MY_VAR MY_VALUE. (Utilisez %env seul pour imprimer les variables d’environnement actuelles.)

Voir: http://ipython.readthedocs.io/fr/stable/interactive/magics.html

33
michael

Vous pouvez configurer les variables d’environnement dans votre code comme suit:

import sys,os,os.path
sys.path.append(os.path.expanduser('~/code/eol_hsrl_python'))
os.environ['HSRL_INSTRUMENT']='gvhsrl'
os.environ['HSRL_CONFIG']=os.path.expanduser('~/hsrl_config')

Ceci, bien sûr, si un correctif temporaire, pour obtenir un correctif permanent, vous aurez probablement besoin d’exporter les variables dans votre ~.profile, plus d’informations peuvent être trouvées ici

13
kardaj

Si vous utilisez Python, vous pouvez définir vos variables d'environnement dans un fichier .env et les charger à partir d'un carnet Jupyter à l'aide de python-dotenv .

Installez python-dotenv:

pip install python-dotenv

Chargez le fichier .env dans un bloc-notes Jupyter:

%load_ext dotenv
%dotenv
2
aparkerlue

Vous pouvez également définir les variables dans votre fichier kernel.json:

Ma solution est utile si vous avez besoin des mêmes variables d’environnement chaque fois que vous démarrez un noyau jupyter, en particulier si vous disposez de plusieurs ensembles de variables d’environnement pour différentes tâches.

Pour créer un nouveau noyau ipython avec vos variables d’environnement, procédez comme suit:

  • Lisez la documentation sur https://jupyter-client.readthedocs.io/fr/stable/kernels.html#kernel-specs
  • Exécutez jupyter kernelspec list pour voir une liste des noyaux installés et où les fichiers sont stockés.
  • Copiez le répertoire contenant le fichier kernel.json (nommé par exemple python2) dans un nouveau répertoire (par exemple, python2_myENV).
  • Changez le display_name dans le nouveau fichier kernel.json.
  • Ajoutez un dictionnaire env définissant les variables d’environnement.

Votre noyau json pourrait ressembler à ceci (je n'ai rien modifié à partir du fichier kernel.json installé à l'exception de display_name et env):

{
 "display_name": "Python 2 with environment",
 "language": "python",
 "argv": [
  "/usr/bin/python2",
  "-m",
  "ipykernel_launcher",
  "-f",
  "{connection_file}"
 ],
 "env": {"LD_LIBRARY_PATH":""}
}

Cas d'utilisation et avantages de cette approche

  • Dans mon cas d'utilisation, je voulais définir la variable LD_LIBRARY_PATH qui affecte la manière dont les modules compilés (par exemple, écrits en C) sont chargés. La définition de cette variable à l'aide de %set_env n'a pas fonctionné.
  • Je peux avoir plusieurs noyaux Python dans différents environnements.
  • Pour changer d’environnement, je dois seulement changer/redémarrer le noyau, mais je n’ai pas besoin de redémarrer l’instance de Jupyter (utile, si je ne veux pas perdre les variables dans un autre cahier). Voir -however - https://github.com/jupyter/notebook/issues/2647
1
TheEspinosa

Si vous avez besoin de la variable définie avant de démarrer le bloc-notes, la seule solution qui a fonctionné pour moi était env VARIABLE=$VARIABLE jupyter notebook avec export VARIABLE=value dans .bashrc

Dans mon cas, tensorflow a besoin de la variable exportée pour réussir son importation dans un cahier.

1
Baschdl

Si vous utilisez systemd, je viens de découvrir que vous semblez devoir les ajouter au fichier d'unité systemd. Ceci sur Ubuntu 16. Les mettre dans les fichiers .profile et .bashrc (même le fichier/etc/profile) empêchait ENV Vars de se trouver dans les cahiers juypter.

Je devais éditer:

/lib/systemd/system/jupyer-notebook.service

et mettre dans la variable que je voulais lire dans le fichier unité comme:

Environment=MYOWN_VAR=theVar

et alors seulement je pourrais le lire depuis le cahier juypter.

1
Andy D

Un piège que j'ai rencontré: Les deux commandes suivantes sont équivalentes. Notez le premier ne peut pas utiliser les guillemets. De manière quelque peu contre-intuitive, le fait de citer la chaîne lors de l'utilisation de %env VAR ... entraîne l'inclusion des guillemets dans la valeur de la variable, ce qui n'est probablement pas ce que vous souhaitez. 

%env MYPATH=C:/Folder Name/file.txt

et

import os
os.environ['MYPATH'] = "C:/Folder Name/file.txt"
0
evan_b

Une solution connexe (à court terme) consiste à stocker vos variables d’environnement dans un seul fichier, au format prévisible, pouvant être recherché lors du démarrage d’un terminal et/ou lu dans le bloc-notes. Par exemple, j'ai un fichier, .env, qui contient les définitions de variable d'environnement au format VARIABLE_NAME=VARIABLE_VALUE (pas de lignes vierges ni d'espaces supplémentaires). Vous pouvez utiliser ce fichier dans les fichiers .bashrc ou .bash_profile lorsque vous démarrez une nouvelle session de terminal et vous pouvez le lire dans un cahier contenant quelque chose comme:

import os
env_vars = !cat ../script/.env
for var in env_vars:
    key, value = var.split('=')
    os.environ[key] = value

J'ai utilisé un chemin relatif pour montrer que ce fichier .env peut vivre n'importe où et qu'il est référencé par rapport au répertoire contenant le fichier de bloc-notes. Cela présente également l'avantage de ne pas afficher les valeurs de variable dans votre code, où que vous soyez.

0
wingr