在64位Python中使用sys.platform=='win32'检查安全吗?
通常,我们用一个条件判断来区分在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 个回答
注意,在Jython中,你不能使用sys.platform
或os.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平台上运行。虽然这样有点丑,但确实有效。
我个人使用platinfo来检测底层平台。
>>> from platinfo import PlatInfo
>>> pi = PlatInfo()
>>> pi.os
'win64'
>>> pi.arch
'x64'
>>> pi.name()
'win64-x64'
对于32位系统,pi.name()
会返回win32-x86
。
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 编程中是非常少见的,以至于其他提供的机制就足够了(甚至更好)。目前的答案是肯定的。希望微软不会改变这个答案。