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

Python 何时使用os.name、sys.platform或platform.system?,python,operating-system,python-import,Python,Operating System,Python Import,据我所知,Python有3种方法可以找出运行的操作系统: os.name sys.platform platform.system() 了解这些信息通常在条件导入或使用不同平台的功能(例如Windows v.s上的time.clock(),UNIX上的time.time())时非常有用 我的问题是,为什么有三种不同的方法?什么时候应该使用一种方法而不是另一种?哪种方式是“最好的”(最经得起未来考验,或者最不可能意外地排除您的程序可以实际运行的特定系统) 似乎sys.platform比os.nam

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

  • os.name
  • sys.platform
  • platform.system()
  • 了解这些信息通常在条件导入或使用不同平台的功能(例如Windows v.s上的
    time.clock()
    ,UNIX上的
    time.time()
    )时非常有用

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

    似乎
    sys.platform
    os.name
    更具体,允许您区分
    win32
    cygwin
    (而不仅仅是
    nt
    ),以及
    darwin
    中的
    linux2
    (而不仅仅是
    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
    ,因此这个问题并不特别紧迫,但我非常感谢您对此做出一些澄清。

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

    来自:

    • 具有较粗的粒度
    • 提供与系统相关的版本信息
    • 该模块提供系统标识的详细检查
    通常,测试某些功能是否可用的“最佳”未来验证方法就是尝试使用它,如果失败,则使用回退

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


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

    在源代码中插入了一点

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

    • sys.platform
      在构建配置期间被指定为编译器定义
    • os.name
      检查特定于操作系统的模块是否可用(例如
      posix
      nt
      ,…)
    • platform.system()
    我的建议是:

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

    • 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())


      这取决于您是否喜欢在未经测试的系统上引发异常或尝试任何操作,以及您的代码的级别是如此之高还是如此之低,以至于无法在类似的未经测试的系统上工作(例如,未经测试的Mac—“posix”或嵌入式ARM系统)。更多的python方法不是枚举所有已知的系统,而是测试可能的相关属性。(例如,系统的持久性被认为是重要的,但不重要的多处理特性。)

      • os.name是正确使用
        os
        模块的足够分辨率。在Python2.7中,可能的值是'posix','nt','os2','ce','java'或'riscos',而自Python3.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()的结果进行分支,但我会使用
      平台
      模块的优点来进行消息和错误记录。

      我想知道我们是否能让Python开发人员确认这一点。甚至可能是开发平台模块的人。使用
      sys.platform.startswith('linux')
      而不是
      sys.platform=='linux2'
      ,以实现未来的兼容性
      os.name
      可能的返回值是
      'posix'
      'nt'
      'java'
      。另见:。我不相信
      'riscos'
      'os2
      '是来自
      os.name
      的可能返回值;他们可能是。这个答案似乎并不详尽。@afeique:我更新了更新版Python的答案,但当时答案是正确的。请参阅(当时的最新版本)。Python2.7仍然受支持,“riscos”可能是它的一个价值。感谢@hynekcer,我感谢您编辑添加Python版本号。我很抱歉没有意识到它在Python 3.3之后发生了变化。我没有仔细阅读文档的不同版本,而是粗略地假设
      os.name
      的Python3行为在不同版本之间是一致的
      Availability: recent flavors of Unix.