Cómo configurar la variable env en el cuaderno Jupyter

Respuestas:

115

Para configurar una variable env en un cuaderno jupyter, simplemente use %comandos mágicos, %envo %set_env, por ejemplo, %env MY_VAR=MY_VALUEo %env MY_VAR MY_VALUE. (Úselo %envsolo para imprimir las variables ambientales actuales).

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

Miguel
fuente
¿Ha probado simplemente las citas? Tenga en cuenta que cambiar el os.environ no es lo mismo: solo puede cambiar ese dict (en la memoria, el proceso actual de Python) y no establece literalmente una var env del SO (por ejemplo, para los comandos! Shell posteriores).
Michael
2
Eliminé mis comentarios anteriores porque no eran del todo precisos, pero tenga en cuenta que los comandos mágicos% env y% set_env se usan os.environ[var] = valen el backend: github.com/ipython/ipython/blob/master/IPython/core/magics/…
evan_b
2
@michael ¿Hay alguna forma de conservar el entorno en todos los portátiles? Configurar el entorno de esta manera parece que solo persiste el entorno del portátil actual.
James Wierzba
30

También puede configurar las variables en su kernel.jsonarchivo:

Mi solución es útil si necesita las mismas variables de entorno cada vez que inicia un kernel de jupyter, especialmente si tiene varios conjuntos de variables de entorno para diferentes tareas.

Para crear un nuevo kernel de ipython con sus variables de entorno, haga lo siguiente:

  • Lea la documentación en https://jupyter-client.readthedocs.io/en/stable/kernels.html#kernel-specs
  • Ejecute jupyter kernelspec listpara ver una lista con los núcleos instalados y dónde se almacenan los archivos.
  • Copie el directorio que contiene kernel.json (por ejemplo, con nombre python2) a un nuevo directorio (por ejemplo python2_myENV).
  • Cambie display_nameen el nuevo kernel.jsonarchivo.
  • Agregue un envdiccionario que defina las variables de entorno.

Su kernel json podría verse así (no modifiqué nada del kernel.json instalado excepto display_namey env):

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

Casos de uso y ventajas de este enfoque

  • En mi caso de uso, quería establecer la variable LD_LIBRARY_PATHque afecta cómo se cargan los módulos compilados (por ejemplo, escritos en C). Establecer esta variable usando %set_envno funcionó.
  • Puedo tener múltiples núcleos de Python con diferentes entornos.
  • Para cambiar el entorno, solo tengo que cambiar / reiniciar el kernel, pero no tengo que reiniciar la instancia de jupyter (útil, si no quiero perder las variables en otro cuaderno). Ver, sin embargo, https://github.com/jupyter/notebook/issues/2647
Bernhard
fuente
¿Puede indicarme cómo agrego C:\Program Files (x86)\Graphviz2.38\bin\dot.exea la ruta del sistema existente utilizando la técnica sugerida? ¿Funcionará si no estoy usando una cuenta de administrador? Estoy usando Windows 10.
Khurram Majeed
Exactamente lo que necesitaba. Python de Homebrew se sobrescribe a sys.executablemenos que PYTHONEXECUTABLEse configure de antemano, que debe configurar antes de que se ejecute Python.
Stefan Dragnev
En mi opinión, esta es la única respuesta correcta, porque usa solo Jupyter, en lugar de depender de la funcionalidad que esté disponible en cualquier kernel específico.
Shadowtalker
19

Si está utilizando Python, puede definir sus variables de entorno en un .envarchivo y cargarlas desde un cuaderno de Jupyter usando python-dotenv .

Instale python-dotenv:

pip install python-dotenv

Cargue el .envarchivo en un cuaderno de Jupyter:

%load_ext dotenv
%dotenv
aparkerlue
fuente
17

Puede configurar variables de entorno en su código de la siguiente manera:

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

Esto, por supuesto, es una solución temporal, para obtener una permanente, probablemente necesite exportar las variables a su ~.profile, se puede encontrar más información aquí

kardaj
fuente
2
Gracias Kardaj, exportar la variable en ~ / .profile lo resolvió, parece que no está leyendo de bashrc, lo cual es un poco extraño.
Ehab AlBadawy
3
La respuesta de Michael con %env MY_VAR=MY_VALUEdebería ser la respuesta correcta a esta pregunta
Sida Zhou
@SidaZhou ¿por qué la respuesta de Michael es mejor?
Él
2
@SidaZhou depende del caso de uso, si desea que los créditos estén disponibles en env, y no quiere que los créditos estén en su cuaderno (por ejemplo, en el control de fuentes), entonces esto no es ideal.
morganics
4

Si necesita la variable de set antes de que esté comenzando el bloc de notas, la única solución que funcionó para mí fue env VARIABLE=$VARIABLE jupyter notebookcon export VARIABLE=valueen .bashrc.

En mi caso, tensorflow necesita la variable exportada para importarla con éxito en un cuaderno.

Baschdl
fuente
2

Un problema con el que me encontré: los siguientes dos comandos son equivalentes. Tenga en cuenta que el primero no puede usar comillas. Algo contrario a la intuición, citar la cadena cuando se usa %env VAR ...dará como resultado que las comillas se incluyan como parte del valor de la variable, que probablemente no sea lo que desea.

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

y

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

Si está utilizando systemd, acabo de descubrir que parece que tiene que agregarlos al archivo de unidad systemd. Esto en Ubuntu 16. Ponerlos en .profile y .bashrc (incluso en / etc / profile) resultó en que las Vars ENV no estuvieran disponibles en los cuadernos juypter.

Tuve que editar:

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

y poner la variable que quería leer en el archivo de la unidad como:

Environment=MYOWN_VAR=theVar

y solo entonces pude leerlo desde dentro de mi cuaderno.

Andy D
fuente
0

Una solución relacionada (a corto plazo) es almacenar sus variables de entorno en un solo archivo, con un formato predecible, que se puede obtener al iniciar una terminal y / o leer en el cuaderno. Por ejemplo, tengo un archivo, .envque tiene mis definiciones de variables de entorno en el formato VARIABLE_NAME=VARIABLE_VALUE(sin líneas en blanco ni espacios adicionales). Puede obtener este archivo en los archivos .bashrco .bash_profileal comenzar una nueva sesión de terminal y puede leerlo en un cuaderno con algo como,

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

Utilicé una ruta relativa para mostrar que este .envarchivo puede vivir en cualquier lugar y ser referenciado en relación con el directorio que contiene el archivo del cuaderno. Esto también tiene la ventaja de no mostrar los valores de las variables dentro de su código en ninguna parte.

wingr
fuente