Python os.environ无法识别空环境变量?两种export写法有何差异?
环境变量导出与Python os.environ的行为疑问
问题
- 环境变量被导出并设置为空值后,使用Python的
os.environ无法获取该变量是否属于预期行为? export foo与export foo=''之间存在什么区别?
测试示例(三个示例分别在不同新终端运行,修改了.zshrc文件导出不同值)
## 示例1:export TEST_ENV_VAR (base) ➜ Code export | grep TEST_ENV_VAR TEST_ENV_VAR='' (base) ➜ Code python Python 3.8.12 (default, Oct 12 2021, 13:49:34) [GCC 7.5.0] :: Anaconda, Inc. on linux Type "help", "copyright", "credits" or "license" for more information. >>> import os >>> 'TEST_ENV_VAR' in os.environ False ## 示例2:export TEST_ENV_VAR='' (base) ➜ Code export | grep TEST_ENV_VAR TEST_ENV_VAR='' (base) ➜ Code python Python 3.8.12 (default, Oct 12 2021, 13:49:34) [GCC 7.5.0] :: Anaconda, Inc. on linux Type "help", "copyright", "credits" or "license" for more information. >>> import os >>> 'TEST_ENV_VAR' in os.environ True ## 示例3:export TEST_ENV_VAR='TEST' (base) ➜ Code export | grep TEST_ENV_VAR TEST_ENV_VAR=TEST (base) ➜ Code python Python 3.8.12 (default, Oct 12 2021, 13:49:34) [GCC 7.5.0] :: Anaconda, Inc. on linux Type "help", "copyright", "credits" or "license" for more information. >>> import os >>> 'TEST_ENV_VAR' in os.environ True
解答
问题1:属于预期行为
这种差异并非Python的问题,根源在于shell处理环境变量导出的逻辑:
- 执行
export TEST_ENV_VAR时,如果该变量此前未定义,shell不会在环境表中创建这个变量,只是在内部导出列表中记录这个名字。子进程(比如Python)只能读取环境表中的条目,自然检测不到它。 - 执行
export TEST_ENV_VAR=''时,shell会明确在环境表中创建一个值为空字符串的变量,并标记为可导出,因此Python的os.environ能正常检测到。
问题2:两者的核心区别
export foo:- 若
foo已存在,仅标记该变量可被导出到子进程,不修改其值; - 若
foo未存在,不会创建值为空的foo变量,仅在shell导出列表中添加名字,环境表中无对应条目,子进程无法读取。
- 若
export foo='':- 无论
foo是否存在,都会创建或覆盖该变量,将其值设为空字符串,同时标记为可导出。该变量会被写入环境表,子进程可正常读取。
- 无论
内容的提问来源于stack exchange,提问作者shb
相关产品推荐
相关产品推荐

