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

zta*_*ent 93 python operating-system python-import

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

  1. os.name
  2. sys.platform
  3. platform.system()

了解此信息通常在条件导入中使用,或者使用不同平台之间的功能(例如,time.clock()在Windows上与time.time()UNIX上).

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

看起来sys.platform是不是更具体的os.name,可以让你区分win32cygwin(而不是只nt),并linux2darwin(而不是只posix).但如果是这样的话,那么sys.platform和之间的区别platform.system()呢?

例如,哪个更好,这个:

import sys
if sys.platform == 'linux2':
    # Do Linux-specific stuff
Run Code Online (Sandbox Code Playgroud)

或这个?:

import platform
if platform.system() == 'Linux':
    # Do Linux-specific stuff
Run Code Online (Sandbox Code Playgroud)

现在我会坚持sys.platform,所以这个问题并不是特别紧迫,但我非常感谢对此有所澄清.

moo*_*eep 62

潜入了源代码.

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

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

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

  • 我做了更多研究,这是详细的答案:/sf/answers/4064990681/。 (3认同)

Abh*_*jit 19

在大多数情况下退化为platform.system(),sys.platform并且有趣地 存在细线差异platform.system()sys.platform

以下是Source 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 = ''
Run Code Online (Sandbox Code Playgroud)

另外根据文档

os.uname()

返回包含标识当前操作系统的信息的5元组.元组包含5个字符串:(sysname,nodename,release,version,machine).有些系统会将节点名截断为8个字符或前导组件; 获取主机名的更好方法是socket.gethostname()甚至socket.gethostbyaddr(socket.gethostname()).

Availability: recent flavors of Unix.
Run Code Online (Sandbox Code Playgroud)


jfs*_*jfs 10

来自sys.platformdocs:

  • os.name 具有更粗糙的粒度
  • os.uname() 提供依赖于系统的版本信息
  • platform模块提供系统身份的详细检查

通常,测试某些功能是否可用的"最佳"面向未来的方法只是尝试使用它并在失败时使用后备.

sys.platform和platform.system()之间的区别是什么?

platform.system()返回它可以从多个来源获得的归一化值:os.uname(),sys.platform,ver命令(在Windows上).


hyn*_*cer 10

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

  • 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模块的优势进行消息和错误记录.


Kei*_*ith 3

我相信平台模块可能是新代码的首选。其他人在它之前就已经存在了。这是一种演变,其他的保留是为了向后兼容。

  • 我想知道是否可以让 Python 开发人员证实这一点。甚至可能是平台模块的开发者。 (11认同)