Python: незалежний від платформи спосіб зміни змінної середовища PATH


89

Чи є спосіб змінити PATHзмінну середовища незалежним від платформи способом за допомогою python?

Щось схоже на os.path.join()?

Відповіді:


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

@RedGlyph Так, вибачте, я думав, що os.pathsep - це "/" та "\". Я не перевіряв цього перед тим, як заявляти;).
bua

11
@bua: Це майже "проблема" os.path.sep != os.pathsep.
krawyoti

@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(та інші змінні середовища) будуть видимими для коду С, запущеного в тому ж процесі.

(Оскільки коментарі не можуть містити форматування, я повинен дати це у відповідь, але я відчуваю, що це важливий момент. Це справді коментар до коментаря щодо відсутності еквівалента "експорту" )


6

Застереження, яке слід пам’ятати щодо модифікації змінних середовища в Python, полягає в тому, що не існує еквівалента команди оболонки "export". Неможливо внести зміни в поточний процес, лише дочірні процеси.


+1: Мудро зазначити, що такі команди, як os.system, os.popenабо subprocess.Popenповинні використовуватися в додатку Python для запуску інших процесів. Інакше це майже безглуздо.
RedGlyph

14
Це не правда.
Гліф

4
Роз'яснення заяви гліфа: це не так , тому що зміни будуть впорскується в поточний процес (який є процесом пітон). OP, ймовірно, означав, що немає можливості вводити зміни в батьківський процес (що, як правило, є оболонкою, з якої виконувався скрипт python).
PonyEars

4
Якщо це означає OP, то оболонка теж не має цієї можливості; exportзмушує копіювати змінну в середовище всіх дочірніх процесів, але не впливає на батьківський процес.
Kyle Strand
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.