python环境大小写敏感 - os.environ[...]

14 投票
3 回答
7521 浏览
提问于 2025-04-17 04:29

我需要以一种不依赖平台的方式访问进程的环境变量。

Python的os模块文档没有说明关于os.environos.getenv的大小写敏感性。在我自己的Ubuntu和Windows 7开发环境中实验后,我发现Linux上的os.environ是区分大小写的,而Windows上则不是(这和两个平台上set的行为一致)。

由于字典在字符串键方面显然是区分大小写的,所以看起来os.environ返回的值只是被“鸭子类型”地当作字典使用...

问题: 我应该在哪里/如何找到关于这种行为的确切答案?我更希望得到一个真实的答案,而不是仅仅通过实验来确定 :)

另外,使用os.getenv(...)是否更好?为什么?

谢谢!

3 个回答

1

我在想,为什么要统一使用某一种方式,不会严重违反“最小惊讶原则”。

在Windows系统上,程序员习惯了不区分大小写……那么,只有在Windows上工作的程序员为什么会觉得需要特别注意这一点呢?要知道,这里根本无法实现区分大小写的环境变量,这个选项根本就不行。

在Linux系统中,ENVVAR和envvar是两个不同的变量,你不能按照Windows的方式来统一,否则可能会隐藏一些信息。

在现在的实现方式中,你强迫开发者在跨平台应用中指定大小写。在Windows上,大小写的规定并不重要,但在*nix系统上你还是得这么做。

1

平台独立性通常意味着在所有平台上都可能表现得不太好。所以在追求平台独立的时候,你需要假设环境变量是区分大小写的,但最好不要依赖这一点(也就是说,不要故意在不同的大小写中创建同名的变量),而是要能处理这种情况。否则,你可能会在非Windows系统上出现问题。

至于哪些平台是区分大小写的,哪些不是,简单来说:Windows是不区分大小写的,而类Unix的操作系统是区分大小写的,具体可以参考:

对于一些特殊的操作系统,你需要查看它们的文档。

希望这些信息对你有帮助。

14

当文档没有说明某个功能的具体行为,而你又想自己找答案时,可以查看源代码。在这种情况下,你可以在线获取 os.py 的源代码,网址是 http://svn.python.org/

代码中的注释是:

elif name in ('os2', 'nt'):  # Where Env Var Names Must Be UPPERCASE
    # But we store them as upper case
    # ...
else:  # Where Env Var Names Can Be Mixed Case
    # ...

你还可以看到不同的实现方式——在Windows上使用的是 key.upper() 而不是 key

Linux:

def __setitem__(self, key, item):
    putenv(key, item)
    self.data[key] = item

Windows:

def __setitem__(self, key, item):
    putenv(key, item)
    self.data[key.upper()] = item

撰写回答