我需要以独立于平台的方式访问进程的环境块。
python os module docs未指定os.environ
/ os.getenv
的区分大小写的任何内容。在我的ubuntu和win7开发盒上进行试验,我发现os.environ在Linux上区分大小写但在Windows上不区分(这反映了set
在两个平台上的行为)
由于dict对于字符串键显然是区分大小写的,因此os.environ
返回的值似乎只是 duck-typed 作为dict ...
问题: 我应该如何/如何找到关于此行为的明确答案?我宁愿有一个真正的答案,而不仅仅是凭经验确定它:)
或者,os.getenv(...)是一个更好的api使用?为什么呢?
谢谢!
答案 0 :(得分:10)
如果文档未指定行为并且您想自己发现答案,则可以查看源代码。在这种情况下,您可以在http://svn.python.org/在线获取os.py
的源代码:
代码中的评论说:
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
视窗:
def __setitem__(self, key, item):
putenv(key, item)
self.data[key.upper()] = item
答案 1 :(得分:1)
平台独立性通常意味着所有平台都会变得更糟。因此,对于与平台无关的方式,您假设环境变量区分大小写,但从不尝试依赖于此(即,不是故意在不同情况下创建具有相同名称的变量),而是能够处理它。否则你可能会搞砸非Windows。
至于哪些平台区分大小写,哪些不是 - 简单。 Windows不区分大小写,类Unix操作系统区分大小写,请参阅:
对于异国情调的操作系统,您必须检查其文档。
希望它有所帮助。
答案 2 :(得分:1)
我很难理解一个或另一个标准化如何不会严重违反最不惊讶的原则。
在Windows上,程序员习惯于不区分大小写...为什么只有Windows的程序员会不得不挑剔呢?请注意,这里没有可能的方法来实现区分大小写的环境变量,该选项根本不起作用。
在linux世界中,ENVVAR和envvar是两个不同的变量,你不能标准化到windows机制而不会隐藏信息。
在实施的版本中,您强制开发人员为跨平台应用指定大写或小写。案例规范与Windows无关,无论如何你都必须为* nix。