何时使用os.name,sys.platform或platform.system?

时间:2010-12-29 10:01:22

标签: python operating-system python-import

据我所知,Python有三种方法可以找出正在运行的操作系统:

  1. os.name
  2. sys.platform
  3. platform.system()
  4. 了解此信息通常在条件导入中使用,或者使用不同平台之间的功能(例如,在UNIX上的Windows v.s. time.clock()上使用time.time()。)

    我的问题是,为什么有3种不同的方法呢?何时应该使用一种方式而不是另一种方式?哪种方式是“最佳”(大多数面向未来或最不可能意外地排除您的程序实际可以运行的特定系统)?

    似乎sys.platformos.name更具体,允许您区分win32cygwin(而不仅仅是nt),以及{来自linux2的{​​1}}(而非darwin)。但如果是这样,那么posixsys.platform之间的差异呢?

    例如,哪个更好,这个:

    platform.system()

    还是这个? :

    import sys
    if sys.platform == 'linux2':
        # Do Linux-specific stuff
    

    现在我会坚持import platform if platform.system() == 'Linux': # Do Linux-specific stuff ,所以这个问题并不是特别紧迫,但我会非常感谢对此有所澄清。

5 个答案:

答案 0 :(得分:58)

潜入了源代码。

sys.platformos.name的输出在编译时确定。 platform.system()在运行时确定系统类型。

  • sys.platform在构建配置期间被指定为编译器定义。
  • os.name检查某些特定于操作系统的模块是否可用(例如posixnt,...)
  • platform.system()实际上运行uname以及其他几个函数来确定运行时的系统类型。

我的建议,使用os.name检查它是否是符合posix的系统,使用sys.platform来检查它是linux,cygwin,darwin,atheos等等,并使用platform.system()好吧,如果你不相信其他来源。

答案 1 :(得分:19)

platform.system()sys.platform之间存在细线差异,有趣的是,大多数情况platform.system()退化为sys.platform

以下是来源Python2.7\Lib\Platform.py\system所说的

def system():

    """ Returns the system/OS name, e.g. 'Linux', 'Windows' or 'Java'.

        An empty string is returned if the value cannot be determined.

    """
    return uname()[0]

def uname():
    # Get some infos from the builtin os.uname API...
    try:
        system,node,release,version,machine = os.uname()
    except AttributeError:
        no_os_uname = 1

    if no_os_uname or not filter(None, (system, node, release, version, machine)):
        # Hmm, no there is either no uname or uname has returned
        #'unknowns'... we'll have to poke around the system then.
        if no_os_uname:
            system = sys.platform
            release = ''
            version = ''
            node = _node()
            machine = ''

同样符合documentation

  

os.uname()

     

返回包含标识当前操作系统的信息的5元组。元组包含5个字符串:(sysname,nodename,   发布,版本,机器)。有些系统会将节点名截断为8   字符或主要组成部分;一个更好的方法来获得   hostname是socket.gethostname()或者甚至   socket.gethostbyaddr(socket.gethostname())。

Availability: recent flavors of Unix.

答案 2 :(得分:10)

来自sys.platform docs

  • os.name具有更粗略的粒度
  • os.uname()提供与系统相关的版本信息
  • platform模块提供系统身份的详细检查

测试一些功能是否可用的“最佳”未来验证方法通常只是尝试使用它并在失败时使用后备。

  

sys.platform和platform.system()之间的区别怎么样?

platform.system()会返回一个标准化值,该值可能来自多个来源:os.uname()sys.platformver命令(在Windows上)。

答案 3 :(得分:9)

这取决于您是否更喜欢在未经测试的系统上引发异常或尝试任何内容,以及您的代码是否如此高级别或低级别以至于它可以或不能在类似的未经测试的系统上工作(例如未经测试的Mac - 'posix '或嵌入式ARM系统)。更多pythonic是不枚举所有已知系统,而是测试可能的相关属性。 (例如,系统的结束性被认为是重要的,但不重要的多处理属性。)

  • os.name是正确使用os模块的足够分辨率。可能的值是Python 2.7中的'posix','nt','os2','ce','java'或'riscos',而自Python 3.4以来只使用'posix','nt'和'java'。

  • sys.platform是一个更精细的分辨率。建议使用if sys.platform.startswith('linux')惯用法,因为“linux2”表示Linux内核版本2.xx或3.目前从未使用过较旧的内核。在Python 3.3中,所有Linux系统都是简单的“linux”。

我不知道“Mac”和“Java”系统的细节,所以我不能使用非常好的方法platform.system()的结果进行分支,但我会利用platform的优点用于消息和错误记录的模块。

答案 4 :(得分:2)

我认为平台模块可能是新代码的首选。其他人存在于此之前。这是一种进化,其他的仍然是向后兼容。