Python: forma independiente de la plataforma para modificar la variable de entorno PATH

Respuestas:

170

Debería poder modificar os.environ.

Dado que os.pathsepes el carácter para separar diferentes rutas, debe usar esto para agregar cada nueva ruta:

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

o, si hay varias rutas para agregar en una lista:

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

Como mencionó, os.path.jointambién se puede usar para cada ruta individual que tenga que agregar en el caso de que tenga que construirlas a partir de partes separadas.

RedGlyph
fuente
¿Qué pasa con los separadores ambientales PATH? ? linux - / usr / bin: / lib: ":" windows - C: \ asdf \; C: \ Prog ...; ";"
bua
2
@bua: ¿te refieres al os.pathsepque mencioné (específico de PATH)?
RedGlyph
@RedGlyph Sí, lo siento, pensé que os.pathsep es "/" y "\". No verifiqué eso antes de reclamar;).
bua
11
@bua: Es casi un "pillé" eso os.path.sep != os.pathsep.
krawyoti
@krawyoti, bua: Ah, ahora veo ... ¡bien visto! De hecho, es un error fácil :-)
RedGlyph
17

Tenga en cuenta que en os.environrealidad no es un diccionario. Es un objeto especial similar a un diccionario que realmente establece variables de entorno en el proceso actual usando setenv .

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

Esto significa que PATH(y otras variables de entorno) serán visibles para el código C ejecutado en el mismo proceso.

(Dado que los comentarios no pueden contener formato, tengo que poner esto en una respuesta, pero siento que es un punto importante que hacer. Este es realmente un comentario sobre el comentario sobre que no hay equivalente a 'exportar' ).

Glifo
fuente
6

La advertencia a tener en cuenta al modificar las variables de entorno en Python es que no existe un equivalente del comando de shell "exportar". No hay forma de inyectar cambios en el proceso actual, solo procesos secundarios.

Matt T
fuente
+1: Es prudente señalar que los comandos como os.system, os.popeno subprocess.Popendeberían usarse desde la aplicación Python para iniciar otros procesos. De lo contrario, es bastante inútil.
RedGlyph
14
Esto no es verdad.
Glifo
4
Aclaración de la declaración de Glyph: esto no es cierto porque los cambios se inyectan en el proceso actual (que es el proceso de Python). OP probablemente significó que no hay forma de inyectar cambios en el proceso principal (que generalmente es un shell desde el que se ejecutó el script de Python).
PonyEars
4
Si eso es lo que significa OP, entonces el shell tampoco tiene esta capacidad; exporthace que una variable se copie en el entorno de todos los procesos secundarios , pero no tiene ningún efecto en el proceso principal.
Kyle Strand