Python: независимый от платформы способ изменения переменной среды PATH

Ответы:

170

Вы должны иметь возможность изменять os.environ.

Поскольку os.pathsepэто символ для разделения разных путей, вы должны использовать его для добавления каждого нового пути:

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

или, если есть несколько путей для добавления в список:

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

Как вы упомянули, os.path.joinтакже можно использовать для каждого отдельного пути, который вы должны добавить, если вам нужно построить их из отдельных частей.

RedGlyph
источник
Что с разделителями среды PATH? ? linux - / usr / bin: / lib: ":" windows - C: \ asdf \; C: \ Prog ...; ";"
bua
2
@bua: вы имеете в виду то, что os.pathsepя упомянул (конкретно для PATH)?
RedGlyph 05
@RedGlyph Да, извините, я думал, что os.pathsep - это "/" и "\". Я не проверял это перед тем, как заявить;).
bua
11
@bua: Это почти что попалось os.path.sep != os.pathsep.
krawyoti 05
@krawyoti, bua: А, теперь я вижу ... хорошо замечено! Это действительно легкая ошибка :-)
RedGlyph
17

Обратите внимание, что на os.environсамом деле это не словарь. Это специальный объект, подобный словарю, который фактически устанавливает переменные среды в текущем процессе с помощью setenv .

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

Это означает, что PATH(и другие переменные среды) будут видны для кода C, запущенного в том же процессе.

(Поскольку комментарии не могут содержать форматирование, я должен указать это в ответе, но я считаю, что это важный момент. Это действительно комментарий к комментарию об отсутствии эквивалента «экспорта» .)

Глиф
источник
6

Предостережение, о котором следует помнить при изменении переменных среды в Python, заключается в том, что не существует эквивалента команды оболочки "export". Нет возможности вносить изменения в текущий процесс, только дочерние процессы.

Мэтт Т
источник
+1: Мудрый , чтобы указать , что из, команд типа os.system, os.popenили subprocess.Popenдолжны быть затем использован из приложения Python для запуска других процессов. В противном случае это практически бессмысленно.
RedGlyph 05
14
Это неправда.
Glyph
4
Разъяснение заявления глифа: это не так , потому что изменения будут впрыскивается в текущий процесс (который является процессом питон). OP, вероятно, означал, что нет способа внедрить изменения в родительский процесс (который обычно представляет собой оболочку, из которой был запущен скрипт python).
PonyEars 03
4
Если это то, что означает OP, то оболочка также не имеет этой возможности; exportвызывает копирование переменной в среду всех дочерних процессов, но не влияет на родительский процесс.
Kyle Strand