可靠地在Python中检测Windows

blo*_*kie 52 python windows platform-detection

我正在研究几种Linux工具,需要阻止在Windows上安装,因为它依赖于FHS,因此在该平台上变得无用.该platform.platform功能接近,但只返回一个字符串.

不幸的是,我不知道在该字符串中搜索什么以获得可靠的结果.有谁知道要搜索什么,或者有人知道我在这里缺少的另一个功能吗?

Mat*_*lin 74

>>> import platform
>>> platform.system()
'Windows'
Run Code Online (Sandbox Code Playgroud)


sbk*_*sbk 55

对于那些来到这里寻找一种方式,从Python的检测Cygwin的(而不是仅仅探测窗),这里有一些例子返回值os.name,并platform.system在不同的平台

OS/build     | os.name | platform.system() 
-------------+---------+-----------------------
Win32 native | nt      | Windows
Win32 cygwin | posix   | CYGWIN_NT-5.1*
Win64 native | nt      | Windows
Win64 cygwin | posix   | CYGWIN_NT-6.1-WOW64*
Linux        | posix   | Linux
Run Code Online (Sandbox Code Playgroud)

从这一点来看,如何区分Windows native和Cygwin应该是显而易见的,尽管我不相信这是未来的证据.

*版本号分别适用于XP和Win7,不依赖它们

  • 所以这正是我在上面的表中列出的Windows上的"原生"Python构建.没有矛盾. (2认同)
  • 只是值得一提,上面只有当python二进制文件使用的是cygwin二进制文件而不是本机windows文件时才有效. (2认同)

pax*_*blo 17

在我的Windows框中,platform.system()返回'Windows'.

但是,我不确定你为什么要打扰.如果你想限制它在技术上运行的平台,我会使用白名单而不是黑名单.

事实上,我根本不会在技术上做到这一点,因为Python的下一个版本可能Win32/Win64代替Windows(用于黑名单)而*nix不是Linux(用于白名单).

我的建议是简单说明要求是什么,如果用户选择忽略它,那就是他们的问题.如果他们打电话说他们收到一条错误消息"无法找到FHS"并且他们承认他们正在Windows上运行,请轻轻地向他们指出它不是受支持的配置.

也许您的客户足够聪明,可以在Windows下运行FHS,以便您的代码可以运行.他们不太可能意识到他们会考虑对您的软件进行任意限制.

这是软件开发人员每天都面临的问题.即使是庞大的组织也无法支持每个平台和配置.


Jed*_*ith 10

试试这个:

import platform

if platform.system() == "Darwin":
    # Don't have Windows handy, but I'd expect "Win32" or "Windows" for it
Run Code Online (Sandbox Code Playgroud)

编辑:刚看到你试过platform.platform()...... platform.system()对于这种情况会更好.相信我,使用它.暗角位于平台检测中.

distutils 如果你问得好的话,也会这样做.

你总是可以像os.path.exists()在Windows文件上那样做坏事......但是platform它和Python标准库一样可靠.

编辑2:另一位有用的回答者指出platform.system(),他的Windows机器上的"Windows"完全相同.


ana*_*nik 8

>>> import os
>>> os.name
'nt'
Run Code Online (Sandbox Code Playgroud)

"已导入操作系统相关模块的名称.目前已注册以下名称:'posix','nt','mac','os2','ce','java','riscos'." (c)http://docs.python.org/library/os.html#os.name

import os
if os.name == 'nt':
    #yourcodehere
Run Code Online (Sandbox Code Playgroud)