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

问题描述 投票:0回答:6

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

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

了解此信息通常在条件导入或使用不同平台的功能时很有用(例如,Windows 上的

time.clock()
与 UNIX 上的
time.time()
)。

我的问题是,为什么要用 3 种不同的方式来做这件事?什么时候应该使用一种方式而不是另一种方式?哪种方式是“最好的”(最有前途的或最不可能意外排除您的程序实际可以运行的特定系统)?

看起来

sys.platform
os.name
更具体,让您可以区分
win32
cygwin
(而不是仅仅
nt
),以及
linux2
darwin
(而不是仅仅
posix
)。但如果是这样,那
sys.platform
platform.system()
之间的区别呢?

比如哪个更好,这个:

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

或者这个? :

import platform
if platform.system() == 'Linux':
    # Do Linux-specific stuff

现在我会坚持

sys.platform
,所以这个问题不是特别紧迫,但我将非常感谢对此的一些澄清。

python operating-system python-import
6个回答
87
投票

深入研究源代码。

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

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

我的建议:

  • 使用
    os.name
    检查它是否是一个符合posix的系统。
  • 使用
    sys.platform
    查看是否是linux、cygwin、darwin、atheos等
  • 如果您不相信其他来源,请使用
    platform.system()

24
投票

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 = ''

也根据文档

os.uname()

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

Availability: recent flavors of Unix.

11
投票

来自

sys.platform
文档

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

通常,测试某些功能是否可用的“最佳”面向未来的方法就是尝试使用它,如果失败则使用回退。

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

platform.system()
返回可能从多个来源获得的规范化值:
os.uname()
sys.platform
ver
命令(在 Windows 上)。


10
投票

这取决于您是喜欢引发异常还是在未经测试的系统上尝试任何事情,以及您的代码是高级别还是低级别以至于它可以或不能在类似的未经测试的系统上运行(例如未经测试的 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
模块的优势来处理消息和错误记录。


3
投票

我相信平台模块可能是新代码的首选。其他人存在于它之前。这是一种进化,其他的保留下来是为了向后兼容。


0
投票

sys.platform
在编译时确定,
platform.system()
在运行时确定。

这意味着前一种用法可以在IDE中检查语法和暗淡无法访问的代码块。

IMO,如果

sys.platform
可以满足您的需求并且在您的代码中运行良好,请使用它。

© www.soinside.com 2019 - 2024. All rights reserved.