python环境大小写敏感 - os.environ[...]
我需要以一种不依赖平台的方式访问进程的环境变量。
Python的os模块文档没有说明关于os.environ
和os.getenv
的大小写敏感性。在我自己的Ubuntu和Windows 7开发环境中实验后,我发现Linux上的os.environ是区分大小写的,而Windows上则不是(这和两个平台上set
的行为一致)。
由于字典在字符串键方面显然是区分大小写的,所以看起来os.environ
返回的值只是被“鸭子类型”地当作字典使用...
问题: 我应该在哪里/如何找到关于这种行为的确切答案?我更希望得到一个真实的答案,而不是仅仅通过实验来确定 :)
另外,使用os.getenv(...)是否更好?为什么?
谢谢!
3 个回答
我在想,为什么要统一使用某一种方式,不会严重违反“最小惊讶原则”。
在Windows系统上,程序员习惯了不区分大小写……那么,只有在Windows上工作的程序员为什么会觉得需要特别注意这一点呢?要知道,这里根本无法实现区分大小写的环境变量,这个选项根本就不行。
在Linux系统中,ENVVAR和envvar是两个不同的变量,你不能按照Windows的方式来统一,否则可能会隐藏一些信息。
在现在的实现方式中,你强迫开发者在跨平台应用中指定大小写。在Windows上,大小写的规定并不重要,但在*nix系统上你还是得这么做。
平台独立性通常意味着在所有平台上都可能表现得不太好。所以在追求平台独立的时候,你需要假设环境变量是区分大小写的,但最好不要依赖这一点(也就是说,不要故意在不同的大小写中创建同名的变量),而是要能处理这种情况。否则,你可能会在非Windows系统上出现问题。
至于哪些平台是区分大小写的,哪些不是,简单来说:Windows是不区分大小写的,而类Unix的操作系统是区分大小写的,具体可以参考:
- http://en.wikipedia.org/wiki/Environment_variable#Case_sensitive
- http://en.wikipedia.org/wiki/Environment_variable#Case_insensitivity
对于一些特殊的操作系统,你需要查看它们的文档。
希望这些信息对你有帮助。
当文档没有说明某个功能的具体行为,而你又想自己找答案时,可以查看源代码。在这种情况下,你可以在线获取 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