python环境案例感性 - os.environ [...]

时间:2011-10-17 17:23:35

标签: python

我需要以独立于平台的方式访问进程的环境块。

python os module docs未指定os.environ / os.getenv的区分大小写的任何内容。在我的ubuntu和win7开发盒上进行试验,我发现os.environ在Linux上区分大小写但在Windows上不区分(这反映了set在两个平台上的行为)

由于dict对于字符串键显然是区分大小写的,因此os.environ返回的值似乎只是 duck-typed 作为dict ...

问题: 我应该如何/如何找到关于此行为的明确答案?我宁愿有一个真正的答案,而不仅仅是凭经验确定它:)

或者,os.getenv(...)是一个更好的api使用?为什么呢?

谢谢!

3 个答案:

答案 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。