Python: moyen indépendant de la plate-forme pour modifier la variable d'environnement PATH

89

Existe-t-il un moyen de modifier la PATHvariable d'environnement de manière indépendante de la plate-forme à l'aide de python?

Quelque chose de similaire à os.path.join()?

resi
la source

Réponses:

170

Vous devriez pouvoir modifier os.environ.

Puisqu'il os.pathseps'agit du caractère pour séparer différents chemins, vous devez l'utiliser pour ajouter chaque nouveau chemin:

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

ou, s'il y a plusieurs chemins à ajouter dans une liste:

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

Comme vous l'avez mentionné, os.path.joinpeut également être utilisé pour chaque chemin individuel que vous devez ajouter dans le cas où vous devez les construire à partir de pièces séparées.

RedGlyph
la source
Qu'en est-il des séparateurs d'environnement PATH? ? linux - / usr / bin: / lib: ":" windows - C: \ asdf \; C: \ Prog ...; ";"
bua
2
@bua: voulez-vous dire le que os.pathsepj'ai mentionné (spécifique à PATH)?
RedGlyph
@RedGlyph Oui, désolé, je pensais que os.pathsep était "/" et "\". Je n'ai pas vérifié cela avant de réclamer;).
bua
11
@bua: C'est presque un "gotcha" ça os.path.sep != os.pathsep.
krawyoti
@krawyoti, bua: Ah, maintenant je vois ... bien repéré! C'est une erreur facile en effet :-)
RedGlyph
17

Veuillez noter qu'il os.environne s'agit pas en fait d'un dictionnaire. C'est un objet spécial semblable à un dictionnaire qui définit en fait les variables d'environnement dans le processus actuel en utilisant setenv .

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

Cela signifie que PATH(et d'autres variables d'environnement) seront visibles pour le code C exécuté dans le même processus.

(Étant donné que les commentaires ne peuvent pas contenir de formatage, je dois le mettre dans une réponse, mais je pense que c'est un point important à souligner. C'est vraiment un commentaire sur le commentaire sur le fait qu'il n'y a pas d'équivalent à «exporter» .)

Glyphe
la source
6

La mise en garde à prendre en compte lors de la modification des variables d'environnement en Python, est qu'il n'y a pas d'équivalent de la commande shell "export". Il n'y a aucun moyen d'injecter des modifications dans le processus actuel, uniquement des processus enfants.

Matt T
la source
+1: Il est sage de le souligner, des commandes comme os.system, os.popenou subprocess.Popendevraient ensuite être utilisées à partir de l'application Python pour lancer d'autres processus. Sinon, c'est à peu près inutile.
RedGlyph
14
Ce n'est pas vrai.
Glyph du
4
Clarification de la déclaration de Glyph: ce n'est pas vrai car les changements sont injectés dans le processus actuel (qui est le processus python). OP signifiait probablement qu'il n'y avait aucun moyen d'injecter des modifications dans le processus parent (qui est généralement un shell à partir duquel le script python a été exécuté).
PonyEars
4
Si c'est ce que signifie OP, alors le shell n'a pas non plus cette capacité; exportentraîne la copie d'une variable dans l'environnement de tous les processus enfants , mais n'a aucun effet sur le processus parent.
Kyle Strand