Làm thế nào để truy cập các giá trị biến môi trường?


2119

Tôi đặt một biến môi trường mà tôi muốn truy cập trong ứng dụng Python của mình. Làm thế nào để tôi có được giá trị của nó?

Câu trả lời:


3169

Biến môi trường được truy cập thông qua os.envir

import os
print(os.environ['HOME'])

Hoặc bạn có thể xem danh sách tất cả các biến môi trường bằng cách sử dụng:

os.environ

Vì đôi khi bạn có thể cần phải xem một danh sách đầy đủ!

# using get will return `None` if a key is not present rather than raise a `KeyError`
print(os.environ.get('KEY_THAT_MIGHT_EXIST'))

# os.getenv is equivalent, and can also give a default value instead of `None`
print(os.getenv('KEY_THAT_MIGHT_EXIST', default_value))

Cài đặt mặc định Python trên Windows là C:\Python. Nếu bạn muốn tìm hiểu trong khi chạy python, bạn có thể làm:

import sys
print(sys.prefix)

1
xin chào, cảm ơn bạn đã trả lời hiệu quả về 'cài đặt mặc định'; hiệu quả trong quan điểm để hiểu nó một cách nhanh chóng hơn là đi qua các liên kết. Điều đó thực sự tôi đánh giá cao :) nhưng về câu hỏi (1) của tôi, vui lòng xem lệnh và xuất đoạn trích bên dưới: >>> nhập os >>> in os.envir ['PYTHONPATH'] TracBack (cuộc gọi gần đây nhất): Tệp " <console> ", dòng 1, trong <module> Tệp" C: \ Python25 \ lib \ os.py ", dòng 435, trong getitem return self.data [key.upper ()] KeyError: 'PYTHONPATH' >>> in os.envir.get ('PYTHONPATH') Không >>> // PLZ sẽ được tiếp tục ... //
Amit Yadav

Theo cách thứ nhất, kịch bản đang ném Ngoại lệ trong khi với cách thứ hai thì không có. Vì vậy, có cách nào để có được giá trị ý nghĩa hay tôi đang làm sai cách ??? Amit.
Amit Yadav

7
os.envir là một từ điển. Cố gắng truy cập một khóa không có trong từ điển sẽ ném KeyError. Phương thức get chỉ trả về Không khi khóa không tồn tại. Bạn có bộ PYTHONPATH không? Bạn có thể thử với một biến như PATH, được đảm bảo tồn tại không? Liệu nó có trả lại một giá trị có ý nghĩa?
Rod

2
PYTHONPATH được sử dụng để thêm đường dẫn tìm kiếm mới vào Python (sys.path) từ bên ngoài Python. Hãy xem docs.python.org/USE/cmdline.html#en môi
Rod

11
.get()cũng có thể được đưa ra một mặc định.
Gringo Suave

243

Để kiểm tra xem khóa có tồn tại không (trả về Truehoặc False)

'HOME' in os.environ

Bạn cũng có thể sử dụng get()khi in phím; hữu ích nếu bạn muốn sử dụng một mặc định.

print(os.environ.get('HOME', '/home/username/'))

nơi /home/username/là mặc định


3
Cái nào tốt hơn, "HOME" in os.environhay os.environ.get('HOME')?
endolith

11
@endolith Họ làm những việc khác nhau. Cái đầu tiên trả về Đúng hoặc Sai, trong khi cái thứ hai trả về một giá trị, có thể là Không.
Trenton

1
@endolith, câu hỏi đúng woud được "HOME" in os.environvs os.environ.get('HOME') is None. Như bạn có thể thấy đầu tiên là dễ đọc hơn và thoải mái để làm việc với.
Konstantin Sekeresh

59

Câu hỏi ban đầu (phần đầu tiên) là "cách kiểm tra các biến môi trường trong Python."

Đây là cách kiểm tra xem $ FOO có được đặt không:

try:  
   os.environ["FOO"]
except KeyError: 
   print "Please set the environment variable FOO"
   sys.exit(1)

66
"FOO" trong os.envir
ealfonso

4
Thử có thể nhanh hơn. Trường hợp của env vars có khả năng tốt nhất cho 'thử': stackoverflow.com/a/185844/187769
RandomInsano

13
@RandomInsano nhanh hơn = / = tốt hơn. Mã này có vẻ khó đọc hơn một "if 'FOO' not in os.environ: ..."khối
Dangercrow

44

Bạn có thể truy cập vào các biến môi trường bằng cách sử dụng

import os
print os.environ

Hãy thử xem nội dung của các biến môi trường PYTHONPATH hoặc PYTHONHOME, có thể điều này sẽ hữu ích cho câu hỏi thứ hai của bạn. Tuy nhiên bạn nên làm rõ nó.


29

Đối với các biến môi trường:

import os
print os.environ["HOME"]

Tôi e rằng bạn phải tăng cường điểm thứ hai của mình thêm một chút nữa trước khi có câu trả lời xác đáng.


27
import os
for a in os.environ:
    print('Var: ', a, 'Value: ', os.getenv(a))
print("all done")

Điều đó sẽ in tất cả các biến môi trường cùng với các giá trị của chúng.


27

Trên thực tế nó có thể được thực hiện điều này đi:

import os

for item, value in os.environ.items():
    print('{}: {}'.format(item, value))

Hoặc đơn giản:

for i, j in os.environ.items():
    print(i, j)

Để xem giá trị trong tham số:

print(os.environ['HOME'])

Hoặc là:

print(os.environ.get('HOME')

Để đặt giá trị:

os.environ['HOME'] = '/new/value'

4
Không, câu trả lời này thực sự không thêm bất cứ điều gì vào đầu câu trả lời hiện có
Bart

1
Điều này nên được loại bỏ, nó là một bản sao của các câu trả lời khác. str.formatchỉ là một bổ sung ưa thích.
Connectyourcharger

>>> import os, pprint; pprint.pprint(list(os.environ.items()))
noobninja

18

Nếu bạn đang dự định sử dụng mã trong mã ứng dụng web sản xuất,
sử dụng bất kỳ khung web nào như Django / Flask, hãy sử dụng các dự án như envparse , sử dụng nó, bạn có thể đọc giá trị như loại đã xác định.

from envparse import env
# will read WHITE_LIST=hello,world,hi to white_list = ["hello", "world", "hi"]
white_list = env.list("WHITE_LIST", default=[]) 
# Perfect for reading boolean
DEBUG = env.bool("DEBUG", default=False)

LƯU Ý: autoenv của kennethreitz là một công cụ được đề xuất để tạo các biến môi trường cụ thể của dự án, xin lưu ý rằng những ai đang sử dụng autoenvvui lòng giữ .envtệp riêng tư (không thể truy cập công khai)


11

Ngoài ra còn có một số thư viện tuyệt vời. Ví dụ, Envs sẽ cho phép bạn phân tích các đối tượng ra khỏi các biến môi trường của bạn, đó là rad. Ví dụ:

from envs import env
env('SECRET_KEY') # 'your_secret_key_here'
env('SERVER_NAMES',var_type='list') #['your', 'list', 'here']

3

Để xem django, hãy xem ( https://github.com/joke2k/django-envir )

$ pip install django-environ

import environ
env = environ.Env(
# set casting, default value
DEBUG=(bool, False)
)
# reading .env file
environ.Env.read_env()

# False if not in os.environ
DEBUG = env('DEBUG')

# Raises django's ImproperlyConfigured exception if SECRET_KEY not in os.environ
SECRET_KEY = env('SECRET_KEY')

0

Bạn cũng có thể thử điều này

Đầu tiên, cài đặt python-decouple

pip install python-decouple

nhập nó trong tập tin của bạn

from decouple import config

Sau đó lấy biến env

SECRET_KEY=config('SECRET_KEY')

Tìm hiểu thêm về thư viện python tại đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.