在64位Python中使用sys.platform=='win32'检查安全吗?

53 投票
4 回答
26313 浏览
提问于 2025-04-15 18:31

通常,我们用一个条件判断来区分在Windows系统和其他操作系统(通常是Linux)上运行的Python应用程序:

if sys.platform == 'win32':
    ...

不过我在想,现在64位的Python越来越普遍,这种判断方法还安全吗?“32”真的就意味着32位吗,还是说它其实是指Win32 API?

如果有一天,sys.platform可能会显示为'win64',那么这样的条件判断是不是会更通用呢?

if sys.platform.startswith('win'):
    ...

我知道还有另一种检测Windows的方法:

if os.name == 'nt':
    ...

但是我真的没见过其他代码里用到这种方法。

那么,最好的方法是什么呢?

更新:如果可以的话,我希望避免使用额外的库。要求安装额外的库来检查我是否在Windows上工作,可能会让Linux用户觉得麻烦。

4 个回答

5

注意,在Jython中,你不能使用sys.platformos.name来做这个:

$ jython -c "import sys, os; print sys.platform; print os.name"
java1.6.0_20
java

我听说Jython项目有计划将os.name改成像CPython那样报告底层操作系统,但因为很多人用os.name == 'java'来检查他们是否在Jython上,所以这个改动不能马上就来。不过,在Jython 2.5.x中已经有了os._name:

$ jython -c "import os; print os._name"
posix

就我个人而言,我倾向于使用os.sep == '/'来处理需要在Jython和CPython上运行的代码,同时也能在Windows和类Unix平台上运行。虽然这样有点丑,但确实有效。

5

我个人使用platinfo来检测底层平台。

>>> from platinfo import PlatInfo
>>> pi = PlatInfo()
>>> pi.os
'win64'
>>> pi.arch
'x64'
>>> pi.name()
'win64-x64'

对于32位系统,pi.name()会返回win32-x86

46

sys.platform 的值会是 win32,无论你的 Windows 系统是 32 位还是 64 位。这一点可以在 PC/pyconfig.h 文件中看到(这是 Python 2.6 的源代码的一部分):

#if defined(MS_WIN64)
/* maintain "win32" sys.platform for backward compatibility of Python code,
   the Win64 API should be close enough to the Win32 API to make this
   preferable */
#       define PLATFORM "win32"

你可以在网上找到最初的补丁,它提供了更多的解释:

主要的问题是:Win64 和 Win32 的相似程度是否足够高,以至于普通的 Python 程序员在编写代码时根本不需要区分这两者。或者,至少这种区分在 Python 编程中是非常少见的,以至于其他提供的机制就足够了(甚至更好)。目前的答案是肯定的。希望微软不会改变这个答案。

撰写回答