Comment définir une variable env dans le notebook Jupyter

92

J'ai un problème que Jupyter ne peut pas voir 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?

Ehab AlBadawy
la source

Réponses:

115

Pour définir une variable env dans un notebook jupyter, utilisez simplement une %commande magique, soit %envou %set_env, par exemple, %env MY_VAR=MY_VALUEou %env MY_VAR MY_VALUE. (Utilisation%env seul pour imprimer les variables environnementales actuelles.)

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

Michael
la source
Avez-vous simplement essayé des citations? Notez que changer os.environ n'est pas la même chose - il ne peut changer que ce dict (en mémoire, processus python actuel), et ne définit pas littéralement une var d'environnement OS (par exemple pour les commandes! Shell suivantes).
michael le
2
J'ai supprimé mes commentaires précédents car ils n'étaient pas tout à fait précis - mais notez que les commandes magiques% env et% set_env utilisent os.environ[var] = valsur le backend: github.com/ipython/ipython/blob/master/IPython/core/magics/…
evan_b
2
@michael Existe-t-il un moyen de conserver l'environnement sur tous les ordinateurs portables? Définir l'environnement de cette manière semble ne conserver que l'environnement du portable actuel.
James Wierzba
31

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

Ma solution est utile si vous avez besoin des mêmes variables d'environnement chaque fois que vous démarrez un noyau jupyter, surtout si vous avez 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/en/stable/kernels.html#kernel-specs
  • Exécutez jupyter kernelspec listpour voir une liste avec les noyaux installés et où les fichiers sont stockés.
  • Copiez le répertoire qui contient le kernel.json (par exemple nommé python2) dans un nouveau répertoire (par exemple python2_myENV).
  • Changer le display_namedans le nouveaukernel.json fichier.
  • Ajoutez un envdictionnaire définissant les variables d'environnement.

Votre noyau json pourrait ressembler à ceci (je n'ai rien modifié du kernel.json installé sauf display_nameet 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_PATHqui affecte la façon dont les modules compilés (par exemple écrits en C) sont chargés. Définition de cette variable à l'aide de%set_env n'a pas fonctionné.
  • Je peux avoir plusieurs noyaux python avec différents environnements.
  • Pour changer d'environnement, je n'ai qu'à changer / redémarrer le noyau, mais je n'ai pas à redémarrer l'instance de jupyter (utile, si je ne veux pas perdre les variables dans un autre notebook). Voir-cependant - https://github.com/jupyter/notebook/issues/2647
Bernhard
la source
Pouvez-vous s'il vous plaît me dire comment puis-je ajouter C:\Program Files (x86)\Graphviz2.38\bin\dot.exeau chemin système existant en utilisant la technique que vous suggérez? Cela fonctionnera-t-il si je n'utilise pas de compte administrateur? J'utilise Windows 10.
Khurram Majeed
Exactement ce dont j'avais besoin. Python de Homebrew écrase à sys.executablemoins qu'il ne PYTHONEXECUTABLEsoit défini au préalable, ce que vous devez définir avant l'exécution de python.
Stefan Dragnev
À mon avis, c'est la seule bonne réponse, car elle n'utilise que Jupyter lui-même, plutôt que de dépendre de la fonctionnalité disponible dans un noyau spécifique.
shadowtalker
19

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

Installez python-dotenv:

pip install python-dotenv

Chargez le .envfichier dans un notebook Jupyter:

%load_ext dotenv
%dotenv
aparkerlue
la source
17

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 est bien sûr un correctif temporaire, pour en obtenir un permanent, vous devez probablement exporter les variables dans votre ~.profile, plus d'informations peuvent être trouvées ici

Kardaj
la source
2
Merci Kardaj, l'exportation de la variable dans ~ / .profile l'a résolu, il semble que ce ne soit pas une lecture de bashrc, ce qui est un peu bizarre.
Ehab AlBadawy
3
La réponse de Michael avec %env MY_VAR=MY_VALUEdevrait être la bonne réponse à cette question
Sida Zhou
@SidaZhou pourquoi la réponse de Michael est-elle meilleure?
Lui le
2
@SidaZhou dépend du cas d'utilisation - si vous voulez que les creds soient disponibles dans env - et que vous ne voulez pas que les creds soient dans votre notebook (par exemple sur le contrôle de source), ce n'est pas idéal.
morganics
4

Si vous avez besoin du jeu de variables avant de démarrer le notebook, la seule solution qui a fonctionné pour moi était env VARIABLE=$VARIABLE jupyter notebookavec export VARIABLE=valuein .bashrc.

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

Baschdl
la source
2

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

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

et

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

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 placer dans le .profile et .bashrc (même le / etc / profile) a eu pour conséquence que l'ENV Vars n'était pas disponible dans les blocs-notes de juypter.

J'ai dû éditer:

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

et mettez la variable que je voulais lire dans le fichier d'unité comme:

Environment=MYOWN_VAR=theVar

et alors seulement pourrais-je le lire à partir du cahier juypter.

Andy D
la source
0

Une solution connexe (à court terme) consiste à stocker vos variables d'environnement dans un seul fichier, avec un format prévisible, qui peut être obtenu lors du démarrage d'un terminal et / ou lu dans le notebook. Par exemple, j'ai un fichier,, .envqui a mes définitions de variable d'environnement au format VARIABLE_NAME=VARIABLE_VALUE(pas de lignes vides ni d'espaces supplémentaires). Vous pouvez générer ce fichier dans les fichiers .bashrcou .bash_profilelorsque vous démarrez une nouvelle session de terminal et vous pouvez le lire dans un cahier avec 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 .envfichier peut vivre n'importe où et être référencé par rapport au répertoire contenant le fichier notebook. Cela a également l'avantage de ne pas afficher les valeurs de variable dans votre code n'importe où.

wingr
la source