如何在Python中访问环境变量?

3192
我该如何在Python中获取环境变量的值?

3
哇,你凭此问题获得了3万声望。 - Peter Kolosov
16个回答

4516

环境变量通过 os.environ 访问:

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

查看所有环境变量的列表:

print(os.environ)

如果键不存在,尝试访问它将引发一个 KeyError。为了避免这种情况:

# Returns `None` if the key doesn't exist
print(os.environ.get('KEY_THAT_MIGHT_EXIST'))

# Returns `default_value` if the key doesn't exist
print(os.environ.get('KEY_THAT_MIGHT_EXIST', default_value))

# Returns `default_value` if the key doesn't exist
print(os.getenv('KEY_THAT_MIGHT_EXIST', default_value))

2
你好Rod,感谢你对“default-installation”问题的有效回复;这对我来说非常有帮助,可以快速理解而不必查看链接。我真的很感激 :) 但是关于我的第一个问题,请看下面的命令和输出片段:
import os
print os.environ['PYTHONPATH'] Traceback (most recent call last): File "<console>", line 1, in <module> File "C:\Python25\lib\os.py", line 435, in getitem return self.data[key.upper()] KeyError: 'PYTHONPATH'
print os.environ.get('PYTHONPATH') None // 请继续...//
- Amit Yadav
11
os.environ 是一个字典。试图访问字典中不存在的键将引发 KeyError。 get 方法仅在键不存在时返回 None。您设置了 PYTHONPATH 吗?您可以尝试使用像 PATH 这样保证存在的变量吗?它返回了有意义的值吗? - Rod
3
PYTHONPATH 用于从 Python 外部添加新的搜索路径到 Python (sys.path)。请查看 http://docs.python.org/using/cmdline.html#environment-variables - Rod
这是一个可移植的解决方案吗? - Charlie Parker
39
.get()可以提供一个默认值。 - Gringo Suave
显示剩余8条评论

357

要检查键是否存在(返回TrueFalse

'HOME' in os.environ

如果你想使用默认值,打印键名时还可以使用get()方法。

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

其中默认值为/home/username/


8
哪个更好,"HOME" in os.environ 还是 os.environ.get('HOME') - endolith
21
它们有不同的功能。第一个返回真或假,而第二个返回一个值,有可能是无。 - Trenton
7
@endolith,正确的问题应该是"HOME" in os.environos.environ.get('HOME') is None的区别。可以看出前者更易读且更易于使用。 - Konstantin Sekeresh

92

实际上可以这样做:

import os

for key, value in os.environ.items():
    print(f'{key}: {value}')

或者简单地说:

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

或者:

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

查看参数中的值:

print(os.environ['HOME'])

或者:

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

设置数值:

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

15
不,这个回答实际上没有在现有回答的基础上增加任何内容。 - Bart
5
应该将此内容移除,它是其他答案的重复。str.format只是一种花哨的附加功能。 - miike3459
>>> import os, pprint; pprint.pprint(list(os.environ.items())) - noobninja
4
感谢第一个提供整个环境可读输出的答案。为了在PyCharm调试器中查看环境,我评估{k: v for k,v in sorted(os.environ.items())} - Noumenon
4
它添加了如何设置值的内容。 - M.C.
我必须同意。看起来是一个重复的答案。设置环境变量与问题无关,这并不是新信息。我还要说,在Python中设置环境变量往往不是你想要的方法,因为环境变量真正的作用是将东西保持在代码库之外,因为它们会因环境而异。 - Kolton Noreen

79

以下是检查$FOO是否设置的方法:

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

6
尝试可以更快。环境变量的情况可能最适合“尝试”:https://dev59.com/XnI-5IYBdhLWcg3weoPR#1835844 - RandomInsano
29
快不等于好。这段代码看起来比一个“如果 'FOO' 不在 os.environ 中,则...”块更难读懂。 - Dangercrow
如果你刚刚设置了变量,你需要在测试之前关闭终端。 - Shane S
环境变量在 if 检查和访问之间是否会发生变化(来自另一个线程或外部来源)?因为这些 TOCTTOU(检查时间到使用时间)问题可以通过 try except 结构来避免! - undefined

63

您可以使用以下方法访问环境变量

import os
print os.environ

尝试查看PYTHONPATH或PYTHONHOME环境变量的内容。这可能对你的第二个问题有所帮助。


42

关于环境变量:

import os
print os.environ["HOME"]

34

导入os模块:

import os

获取环境变量:

os.environ.get('Env_var')

设置环境变量的方法:

# Set environment variables
os.environ['Env_var'] = 'Some Value'

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

这将打印出所有的环境变量及其值。


26

如果您计划在生产 Web 应用程序中使用代码,并使用任何 Web 框架,如DjangoFlask,请使用envparse等项目。使用它,您可以按照您定义的类型读取值。

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)

注意:kennethreitz的autoenv是一个推荐的工具,用于创建特定项目的环境变量。对于那些使用autoenv的人,请注意保持.env文件私密(对公众不可访问)。


2
envparse 被大约 4,000 人使用,自 2015 年以来已经没有维护;而 dotenv 则被 240,000 人使用。众人的选择已经明确。 - Michael Currie

17

此外还有许多优秀的库。Envs,例如,可以让您解析环境变量中的对象,这很棒。例如:

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

3
“rad”在“which is rad”的意思是什么? rad - “1.(俚语)radical的缩写,表示极好的意思。” - Peter Mortensen

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接