Muszę ustawić niektóre zmienne środowiskowe w skrypcie Pythona i chcę, aby wszystkie inne skrypty wywoływane z Pythona widziały ustawione zmienne środowiskowe.
Jeśli zrobię
os.environ["DEBUSSY"] = 1`
narzeka, że 1
musi to być sznurek.
Chcę również wiedzieć, jak odczytać zmienne środowiskowe w pythonie (w dalszej części skryptu) po ustawieniu.
python
environment-variables
prahallada
źródło
źródło
Odpowiedzi:
Zmienne środowiskowe muszą być łańcuchami, więc używaj
aby ustawić zmienną
DEBUSSY
na ciąg1
.Aby uzyskać dostęp do tej zmiennej później, po prostu użyj:
Procesy potomne automatycznie dziedziczą zmienne środowiskowe procesu macierzystego - nie jest wymagane żadne specjalne działanie z Twojej strony.
źródło
putenv()
, ale dla tych Uniksów i tak nic nie możesz zrobić. Obsługiwana była nawet stara wersja AIX i HPUX, z którą pracowałem. Jeśli ktoś rzeczywiście jest w stanie znaleźć komputer, który go nie obsługuje, mam poważne wątpliwości, czy uda mu się uruchomić Python na tym komputerze. :)Konieczne może być rozważenie dalszych aspektów niezawodności kodu;
gdy przechowujesz zmienną o wartości całkowitej jako zmienną środowiskową, spróbuj
następnie w celu pobrania weź pod uwagę, że aby uniknąć błędów, powinieneś spróbować
ewentualnie zamień „-1” na „Not Set”
podsumowując to wszystko
źródło
myvar = int(os.environ.get('MYVAR')) if os.environ.get('MYVAR', '') != '' else None
- w ten sposób byłoby Brak, gdyby nie podano numeruvalue_not_set = '-1'
.). Następnie możesz użyćdebussy = int(os.environ.get('DEBUSSY', value_not_set))
os.environ
zachowuje się jak słownik Pythona, więc można wykonywać wszystkie typowe operacje słownikowe. Oprócz operacjiget
iset
wymienionych w innych odpowiedziach możemy również po prostu sprawdzić, czy istnieje klucz. Klucze i wartości powinny być przechowywane jako ciągi znaków .Python 3
W Pythonie 3 słowniki używają słowa kluczowego in zamiast has_key
Python 2
Należy pamiętać o jednej ważnej rzeczy
os.environ
:Chociaż procesy potomne dziedziczą środowisko po procesie nadrzędnym, niedawno natknąłem się na problem i zorientowałem się, że jeśli inne skrypty aktualizują środowisko podczas działania skryptu python, wywołanie
os.environ
ponownie nie będzie odzwierciedlało najnowszych wartości .Fragment dokumentów :
os.environ.data
który przechowuje wszystkie zmienne środowiskowe, jest obiektem dict, który zawiera wszystkie wartości środowiskowe:źródło
os.environ.data
w Pythonie 3.2 zmieniono jego nazwę naos.environ._data
prefiks podkreślenia pokazujący, że nie należy go czytać bezpośrednio. Zresztą ios.environ._data
tak nie zaktualizuje wartości.Więc zrób
Po prostu użyj
os.environ["DEBUSSY"]
, jak wźródło
ustawić zmienną:
Metoda przypisania przedmiotu za pomocą klucza:
uzyskać lub sprawdzić, czy istnieje, czy nie,
ponieważ os.environ jest instancją, możesz wypróbować sposób obiektowy.
Metoda 1:
otrzyma
'1'
jako wartość zwracanąMetoda 2:
Metoda 3:
Metoda 4:
źródło
Powinieneś przypisać wartość ciągu do zmiennej środowiskowej.
os.environ["DEBUSSY"] = "1"
Jeśli chcesz odczytać lub wydrukować zmienną środowiskową, po prostu użyj
print os.environ["DEBUSSY"]
Zmiany będą obowiązywać tylko w bieżącym procesie, do którego zostały przypisane, nie spowoduje trwałej zmiany wartości. Procesy potomne automatycznie odziedziczą środowisko procesu macierzystego.
źródło
set [<name>=[<value>]]
ale robi to tylko dla bieżącego procesu. Kiedy zamykam cmd, nie istnieje i nawet gdy jest otwarty, inne programy go nie widzą.Co
os.environ["DEBUSSY"] = '1'
? Zmienne środowiskowe są zawsze łańcuchami.źródło
Próbowałem dodać zmienne środowiskowe. Moim celem było przechowywanie niektórych informacji o użytkownikach w zmiennych systemowych, dzięki czemu mogę używać tych zmiennych w przyszłych rozwiązaniach, jako alternatywę dla plików konfiguracyjnych. Jednak metoda opisana w poniższym kodzie wcale mi nie pomogła.
Ten prosty blok kodu działa dobrze, jednak te zmienne istnieją w odpowiednich procesach, tak że nie znajdziesz ich w zakładce zmiennych środowiskowych w ustawieniach systemu Windows. Prawie powyższy kod nie służył mojemu celowi. Ten problem jest omawiany tutaj: problem ze składowaniem zmiennej
Kolejna nieudana próba. Wreszcie udało mi się pomyślnie zapisać zmienną w rejestrze środowiska Windows, naśladując polecenia powłoki systemu Windows zawarte w klasie systemowej pakietu OS. Poniższy kod opisuje tę udaną próbę.
Mam nadzieję, że będzie to pomocne dla niektórych z was.
źródło
Należy zauważyć, że jeśli spróbujesz ustawić zmienną środowiskową na ocenę bash, nie zapiszesz tego, czego oczekujesz. Przykład:
Nie będzie to oceniać tak jak w powłoce, więc zamiast uzyskać
/Library/Java/JavaVirtualMachines/jdk1.8.0_144.jdk/Contents/Home
ścieżkę, otrzymasz dosłowne wyrażenie$(/usr/libexec/java_home)
.Pamiętaj, aby to ocenić przed ustawieniem zmiennej środowiskowej, na przykład:
źródło
Możesz użyć
os.environ
słownika, aby uzyskać dostęp do zmiennych środowiskowych.Problem, który miałem, polega na tym, że gdybym spróbował
os.system
uruchomić plik wsadowy, który ustawia zmienne środowiskowe (używając polecenia SET w pliku **. Bat *), tak naprawdę nie ustawiłby ich dla twojego środowiska python (ale dla proces potomny utworzony za pomocąos.system
funkcji). Aby faktycznie uzyskać zmienne ustawione w środowisku python, używam tego skryptu:źródło
Podczas gry ze zmiennymi środowiskowymi (dodawaj / modyfikuj / usuwaj zmienne) dobrą praktyką jest przywrócenie poprzedniego stanu po zakończeniu funkcji.
Możesz potrzebować czegoś takiego, jak
modified_environ
menedżer kontekstu opisany w tym pytaniu, aby przywrócić zmienne środowiskowe.Klasyczne zastosowanie:
źródło