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также можно использовать для каждого отдельного пути, который вы должны добавить, если вам нужно построить их из отдельных частей.


Что с разделителями среды 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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.