Наверняка вы замечали, что в Python есть удобная функция для получения переменной окружения
os.getenv(NAME)
И её "сестра" для создания или изменения переменных окружения
os.putenv(NAME, VALUE)
Но почему-то putenv() не работает как должно. Энвайромент не обновляется!
os.putenv('MYVAR', '1')
print(os.getenv('MYVAR'))
... и ничего 😴
Почему так?
На самом деле энвайромент обновляется, но это значение не добавляется в словарь os.environ.
Откройте исходник функции os.getenv(). Это просто шорткат для os.environ.get()
В то время как putenv() это built-in С-функция.
Словарь os.environ (или точней класс из MutableMapping) создаётся из энвайромента в момент инициализации. Функция putenv() самостоятельно его не изменяет.
В тоже время, когда вы создаёте или изменяете ключ в os.environ, автоматически вызывается putenv() в методе __setitem__().
То есть, технически putenv() всё делает верно, но в os.environ это не отражается. Можно проверить так:
>>> os.putenv('MYVAR', '123')
>>> os.system('python -c "import os;print(os.getenv(\'MYVAR\'))"')
123
Я объявил переменную в текущем процессе и вызвал дочерний процесс, который её унаследовал и получил в составе os.environ.
Аналогично при удалении переменной вызывается еще одна built-in функция unsetenv(), удаляющая переменную из системы.
Итого
▫️ Удобней всего явно обновлять переменные через os.environ
▫️ Есть способ неявно создать/удалить переменную через putenv/unsetenv, что не повлияет на os.environ но изменит энвайромент и передаст изменения сабпроцессам. Но так лучше не делать!
▫️os.environ это просто обертка для built-in функций putenv() и unsetenv().
#basic
#Italia🇮🇹
#Comunali
#Matera
❗️Roberto #Cifarelli (#PD|S&D; #Azione|RE; #PiùEu|RE; #IV|RE; #PSI|S&D; #Volt|G/EFA; civiche) e Antonio #Nicoletti (#FdI|ECR; #FI|PPE; #LSP|PfE; #UdC|PPE; civiche) si sfideranno al ballottaggio, che si terrà domenica 8 e lunedì 9 giugno 2025.
@TuttoElezioni
#Italia🇮🇹
#Comunali
#Matera
A Matera, unico Comune superiore al voto in Basilicata, sono 5 in candidati.
Per il centrodestra, il candidato è Antonio #Nicoletti, sostenuto da Fratelli d'Italia (#FdI|ECR), Forza Italia (#FI|PPE), Lega (#LSP|PfE), Unione di Centro (#UdC|PPE), Io Sud e altre liste civiche.
Il campo del centrosinistra invece si presenta diviso:
- Domenico #Bennardi è il candidato del Movimento 5 Stelle (#M5S|LEFT), eletto nel 2020 e dimessosi nel 2024;
- Roberto #Cifarelli è sostenuto dal Partito Democratico (#PD|S&D; sebbene il simbolo del partito non sia presente), #Azione|RE, +Europa (#PiùEu|RE), Italia Viva (#IV|RE; simbolo non presente), Partito Socialista Italiano (#PSI|S&D), #Volt|G/EFA e da liste civiche.
Gli altri due candidati sono Luca #Prisco (liste civiche) e Vincenzo #Santochirico (sostenuto da #EV|G/EFA).
@TuttoElezioni