首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >何时使用os.name、sys.platform或platform.system?

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

Stack Overflow用户
提问于 2010-12-29 10:01:22
回答 5查看 61.1K关注 0票数 133

据我所知,Python有三种方法来查找运行什么操作系统:

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

了解这些信息通常在条件导入中很有用,或者使用不同平台的功能(例如WindowsV.S.UNIX上的time.clock()time.time() )。

我的问题是,为什么有三种不同的方法?什么时候应该使用一种方式而不是另一种方式?哪种方式是“最好的”(最适合将来使用,或者最不可能意外地排除程序实际运行的特定系统)?

sys.platform似乎比os.name更具体,它允许您区分win32cygwin (相对于仅nt),以及linux2darwin (与posix相反)。但如果是这样,那sys.platformplatform.system()之间的区别呢?

例如,更好的是:

代码语言:javascript
复制
import sys
if sys.platform == 'linux2':
    # Do Linux-specific stuff

还是这个?

代码语言:javascript
复制
import platform
if platform.system() == 'Linux':
    # Do Linux-specific stuff

现在我将坚持使用sys.platform,所以这个问题并不是特别紧迫,但是我非常感谢您对此作出一些澄清。

EN

回答 5

Stack Overflow用户

发布于 2012-07-26 17:43:48

深入到源代码中。

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

  • sys.platform在编译过程中被指定为编译器定义,用于检查某些os特定模块是否可用(例如,posixnt、...)
  • platform.system()实际上运行uname,以及在运行时可能运行几个其他函数来确定系统类型。

我的建议:

  • 使用os.name检查它是否符合posix标准,
  • 使用sys.platform检查它是否是linux、cygwin、达尔文、无神论等等。
  • 使用platform.system() (如果你不相信其他来源)。H 226f 227
票数 83
EN

Stack Overflow用户

发布于 2013-01-13 05:58:35

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

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

代码语言:javascript
复制
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、release、version、machine)。有些系统将节点名截断为8个字符或前面的组件;获得主机名的更好方法是socket.gethostname(),甚至是socket.gethostbyaddr(socket.gethostname())。

可用性: Unix.的最新版本

票数 24
EN

Stack Overflow用户

发布于 2012-07-26 15:21:32

来自sys.platform docs

  • os.name有一个更粗的granularity
  • os.uname()给出了依赖于系统的版本information
  • The platform模块提供了对系统标识

的详细检查。

通常,测试某些功能是否可用的“最好的”未来验证方法就是尝试使用它,如果失败了就使用备用。

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

platform.system()返回一个规范化值,它可能从几个来源获得:os.uname()sys.platformver命令(在Windows上)。

票数 11
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4553129

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档