Como Aceder a Variáveis de Ambiente em Python

  1. O que são variáveis de ambiente
  2. Variáveis de ambiente em Python
  3. Ler variáveis de ambiente em Python
  4. Anexar variáveis de ambiente em Python

O que são variáveis de ambiente

Variáveis de ambiente são variáveis às quais são atribuídos valores externamente ao programa Python. Os desenvolvedores geralmente as definem na linha de comando antes de invocar o executável Python. O sistema operacional então torna estas variáveis acessíveis para um programa Python a partir de dentro.

As variáveis de ambiente existem para a flexibilidade do programa. Desta forma, um usuário pode alterar parâmetros específicos antes da execução do programa, e o programa será capaz de analisar estes parâmetros e modificar o seu comportamento dinamicamente. Nenhuma modificação de código é necessária, e tal uso de variáveis de ambiente é chamado configuração do programa.

Variáveis de ambiente em Python

O mecanismo de definição de variáveis de ambiente é dependente da plataforma. Por esse motivo, elas são disponibilizado através do módulo Python’s built-in os, que abstrai funcionalidade dependente do sistema operacional.

O tempo de execução Python mantém todas as variáveis de ambiente do programa em um dicionário objeto os.environ.

Note que o objeto os.environ é preenchido quando o tempo de execução Python carrega o módulo os. Se você tentar mudar as variáveis de ambiente após o fato de (por exemplo, exportando uma nova variável de ambiente no emulador de terminal), não vai funcionar.

Ler variáveis de ambiente em Python

O acesso às variáveis de ambiente em Python é feito através da execução de dicionários operações no objeto os.environ.

>>> import os
>>> os.environ
environ({'HOME': '/Users/john', 'LANG': 'en_US.UTF-8', 'LOGNAME': 'john', 'OLDPWD': '/Users/john', 'PATH': '/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin', 'PWD': '/Users/john/python-tutorial', 'SHELL': '/bin/zsh', 'TERM': 'screen', 'TERM_PROGRAM': 'Apple_Terminal', 'TERM_PROGRAM_VERSION': '433', 'TERM_SESSION_ID': 'CDC91EF3-15D6-41AD-A17B-E959D97BC4B5', 'TMPDIR': '/var/folders/md/31nwv67j113d19z0_1287f1r0000gn/T/', 'TMUX': '/private/tmp/tmux-501/default,3319,0', 'TMUX_PANE': '%28' , 'USER': 'john', '_': '/usr/local/bin/python3', '__PYVENV_LAUNCHER__': '/usr/local/bin/python3'})
>>> os.environ['HOME']
'/Users/john'
>>> os.environ['LANG']
'en_US.UTF-8'

Se você acessar uma variável de ambiente utilizando uma notação subscrita [], e essa variável estiver indefinida, você receberá um erro de tempo de execução.

>>> os.environ['I_DONT_EXIST']
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/Cellar/python/3.7.5/Frameworks/Python.framework/Versions/3.7/lib/python3.7/os.py", line 679, in __getitem__
    raise KeyError(key) from None
KeyError: 'I_DONT_EXIST'

Para evitar este problema, você pode ler a partir do objeto os.environ utilizando a interface get(). Se uma variável de ambiente pesquisada não tiver sido definida, get() retorna None.

>>> result = os.environ.get('I_DONT_EXIST')
>>> print(result)
None

Uma característica de conveniência da interface get() é que você pode especificar um valor padrão para utilizar para o caso de não existir uma variável de ambiente pesquisada.

>>> os.environ.get('I_DONT_EXIST', 'I_AM_DEFAULT')
'I AM DEFAULT'

Uma alternativa para os.environ.get() é utilizar os.getenv() function. Ambas as funções funcionam da mesma forma, e você pode tratar esta última como uma API de conveniência.

Anexar variáveis de ambiente em Python

Às vezes você precisa alterar ou anexar uma variável de ambiente de dentro do seu programa. Por exemplo, isso pode acontecer se você precisar modificar o comportamento da sua aplicação ao receber um pedido de configuração de rede. Você muda variáveis de ambiente utilizando o operador subscript [] como se os.environ tivesse sido um dicionário padrão.

>>> import os
>>> os.environ['LANG']
'en_US.UTF-8'
>>> os.environ['LANG'] = 'en_GB.UTF-8'
>>> os.environ['LANG']
'en_GB.UTF-8'

Note que os valores das variáveis de ambiente devem ser do tipo string. Se você tentar atribuir um número inteiro ou qualquer outro valor que não seja string a uma variável de ambiente, você vai ter um erro de tempo de execução.

>>> import os
>>> os.environ['LANG'] = 4
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/Cellar/python/3.7.5/Frameworks/Python.framework/Versions/3.7/lib/python3.7/os.py", line 684, in __setitem__
    value = self.encodevalue(value)
  File "/usr/local/Cellar/python/3.7.5/Frameworks/Python.framework/Versions/3.7/lib/python3.7/os.py", line 754, in encode
    raise TypeError("str expected, not %s" % type(value).__name__)
TypeError: str expected, not int