Python: forma independente de plataforma para modificar a variável de ambiente PATH

92

Existe uma maneira de modificar a PATHvariável de ambiente de forma independente da plataforma usando python?

Algo semelhante a os.path.join()?

resi
fonte

Respostas:

174

Você deve ser capaz de modificar os.environ.

Como os.pathsepé o caractere para separar caminhos diferentes, você deve usar isso para anexar cada novo caminho:

os.environ["PATH"] += os.pathsep + path

ou, se houver vários caminhos para adicionar em uma lista:

os.environ["PATH"] += os.pathsep + os.pathsep.join(pathlist)

Como você mencionou, os.path.jointambém pode ser usado para cada caminho individual que você deve anexar, caso precise construí-los a partir de partes separadas.

RedGlyph
fonte
O que acontece com os separadores de ambiente PATH? ? linux - / usr / bin: / lib: ":" windows - C: \ asdf \; C: \ Prog ...; ";"
bua
2
@bua: você quer dizer o que os.pathsepeu mencionei (específico para PATH)?
RedGlyph
@RedGlyph Sim, desculpe, pensei que os.pathsep fosse "/" e "\". Não verifiquei isso antes de reivindicar;).
bua
11
@bua: É quase um "peguei" isso os.path.sep != os.pathsep.
krawyoti
@krawyoti, bua: Ah, agora entendo ... bem localizado! Na verdade, é um erro fácil :-)
RedGlyph
18

Observe que os.environnão é realmente um dicionário. É um objeto especial semelhante a um dicionário que define as variáveis ​​de ambiente no processo atual usando setenv .

>>> os.environ.__class__
<class os._Environ at 0x100472050>
>>> import os
>>> os.environ["HELLO"] = "WORLD"
>>> os.getenv("HELLO")
'WORLD'

Isso significa que PATH(e outras variáveis ​​de ambiente) estarão visíveis para o código C executado no mesmo processo.

(Uma vez que os comentários não podem conter formatação, tenho que colocar isso em uma resposta, mas acho que é um ponto importante a se fazer. Este é realmente um comentário sobre o comentário sobre não haver equivalente a 'exportar' .)

Glifo
fonte
6

A advertência a ter em conta ao modificar as variáveis ​​de ambiente em Python é que não há equivalente do comando shell "export". Não há como injetar mudanças no processo atual, apenas processos filhos.

Matt T
fonte
+1: sábio para apontar isso, comandos gostam os.system, os.popenou subprocess.Popendeveriam ser usados ​​a partir do aplicativo Python para iniciar outros processos. Caso contrário, é praticamente inútil.
RedGlyph
4
Esclarecimento da declaração de Glyph: isso não é verdade porque as alterações são injetadas no processo atual (que é o processo python). OP provavelmente significava que não havia maneira de injetar alterações no processo pai (que normalmente é um shell do qual o script Python foi executado).
PonyEars
4
Se isso é o que OP significa, então o shell também não tem esse recurso; exportfaz com que uma variável seja copiada no ambiente de todos os processos filho , mas não tem efeito no processo pai.
Kyle Strand