Como definir a variável env no notebook Jupyter

98

Eu tenho um problema que o Jupyter não pode ver a variável env no arquivo bashrc, há uma maneira de carregar essas variáveis ​​no jupyter ou adicionar a variável custome a ele?

Ehab AlBadawy
fonte

Respostas:

122

Para definir uma variável env em um bloco de notas jupyter, basta usar os %comandos mágicos, %envou %set_env, por exemplo, %env MY_VAR=MY_VALUEou %env MY_VAR MY_VALUE. (Usar%env sozinho para imprimir as variáveis ​​ambientais atuais.)

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

Michael
fonte
Você simplesmente tentou aspas? Observe que alterar o os.environ não é o mesmo - ele só pode alterar esse (na memória, processo Python atual) e não define literalmente um env var do sistema operacional (por exemplo, para comandos! Shell subsequentes).
michael
2
Excluí meus comentários anteriores porque não eram muito precisos - mas observe que os comandos mágicos% env e% set_env usam os.environ[var] = valno backend: github.com/ipython/ipython/blob/master/IPython/core/magics/…
evan_b
2
@michael Existe alguma maneira de manter o ambiente em todos os notebooks? Definir o ambiente desta forma parece apenas persistir o ambiente para o notebook atual.
James Wierzba
34

Você também pode definir as variáveis ​​em seu kernel.jsonarquivo:

Minha solução é útil se você precisar das mesmas variáveis ​​de ambiente sempre que iniciar um kernel jupyter, especialmente se você tiver vários conjuntos de variáveis ​​de ambiente para tarefas diferentes.

Para criar um novo kernel ipython com suas variáveis ​​de ambiente, faça o seguinte:

  • Leia a documentação em https://jupyter-client.readthedocs.io/en/stable/kernels.html#kernel-specs
  • Execute jupyter kernelspec listpara ver uma lista com os kernels instalados e onde os arquivos estão armazenados.
  • Copie o diretório que contém o kernel.json (por exemplo, nomeado python2) para um novo diretório (por exemplopython2_myENV ).
  • Mude o display_namepelo novokernel.json arquivo.
  • Adicione um envdicionário definindo as variáveis ​​de ambiente.

Seu kernel json pode ter esta aparência (eu não modifiquei nada no kernel.json instalado, exceto display_namee 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 e vantagens desta abordagem

  • No meu caso de uso, eu queria definir a variável LD_LIBRARY_PATHque afeta o modo como os módulos compilados (por exemplo, escritos em C) são carregados. Definindo esta variável usando%set_env não funcionou.
  • Posso ter vários kernels Python com ambientes diferentes.
  • Para mudar o ambiente, só preciso trocar / reiniciar o kernel, mas não preciso reiniciar a instância do jupyter (útil, se não quiser perder as variáveis ​​em outro notebook). Consulte, no entanto, https://github.com/jupyter/notebook/issues/2647
Bernhard
fonte
Você pode me informar como faço C:\Program Files (x86)\Graphviz2.38\bin\dot.exepara adicionar ao caminho do sistema existente usando sua técnica sugerida? Funcionará se eu não estiver usando uma conta de administrador? Estou usando o Windows 10.
Khurram Majeed
Exatamente o que eu precisava. O Python do Homebrew sobrescreve a sys.executablemenos que PYTHONEXECUTABLEseja definido de antemão, que você deve definir antes de executar o python.
Stefan Dragnev
Na minha opinião, esta é a única resposta correta, porque ele usa apenas o próprio Jupyter, ao invés de depender da funcionalidade disponível em qualquer kernel específico.
shadowtalker
23

Se estiver usando Python, você pode definir suas variáveis ​​de ambiente em um .envarquivo e carregá-las de dentro de um notebook Jupyter usando python-dotenv .

Instale o python-dotenv:

pip install python-dotenv

Carregue o .envarquivo em um notebook Jupyter:

%load_ext dotenv
%dotenv
Aparkerlue
fonte
17

Você pode configurar variáveis ​​de ambiente em seu código da seguinte maneira:

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

É claro que esta é uma correção temporária, para obter uma permanente, você provavelmente precisará exportar as variáveis ​​para o seu ~.profile, mais informações podem ser encontradas aqui

Kardaj
fonte
2
Obrigado Kardaj, exportar a variável em ~ / .profile resolveu, parece que não está lendo do bashrc o que é meio estranho.
Ehab AlBadawy
3
a resposta de Michael com %env MY_VAR=MY_VALUEdeve ser a resposta correta para esta pergunta
Sida Zhou
@SidaZhou por que a resposta de Michael é melhor?
Ele
2
@SidaZhou depende do caso de uso - se você deseja que os creds estejam disponíveis no ambiente - e não quer que os creds estejam em seu notebook (por exemplo, no controle de origem), então isso não é o ideal.
morganics
5

Se você precisa da variável definida antes de iniciar o notebook, a única solução que funcionou para mim foi env VARIABLE=$VARIABLE jupyter notebookcom export VARIABLE=valueem .bashrc.

No meu caso, tensorflow precisa da variável exportada para importá-la com sucesso em um notebook.

Baschdl
fonte
3

Uma pegadinha que encontrei: Os dois comandos a seguir são equivalentes. Observe que o primeiro não pode usar aspas. De forma um tanto contra-intuitiva, citar a string ao usar %env VAR ...resultará na inclusão das aspas como parte do valor da variável, o que provavelmente não é o que você deseja.

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

e

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

Se você estiver usando o systemd, acabei de descobrir que você precisa adicioná-los ao arquivo de unidade do systemd. Isso no Ubuntu 16. Colocá-los no .profile e .bashrc (até mesmo no / etc / profile) resultou no ENV Vars não estar disponível nos blocos de notas Juypter.

Tive que editar:

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

e coloque a variável que eu queria ler no arquivo de unidade como:

Environment=MYOWN_VAR=theVar

e só então pude ler de dentro do caderno da juypter.

Andy D
fonte
0

Uma solução relacionada (de curto prazo) é armazenar suas variáveis ​​de ambiente em um único arquivo, com um formato previsível, que pode ser obtido ao iniciar um terminal e / ou lido no notebook. Por exemplo, eu tenho um arquivo,, .envque tem minhas definições de variáveis ​​de ambiente no formato VARIABLE_NAME=VARIABLE_VALUE(sem linhas em branco ou espaços extras). Você pode originar este arquivo nos arquivos .bashrcou .bash_profileao iniciar uma nova sessão de terminal e você pode ler isso em um notebook com algo como,

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

Usei um caminho relativo para mostrar que esse .envarquivo pode residir em qualquer lugar e ser referenciado em relação ao diretório que contém o arquivo do notebook. Isso também tem a vantagem de não exibir os valores das variáveis ​​em seu código em nenhum lugar.

Wingr
fonte