在64位Python上使用sys.platform =='win32'检查是否安全?

时间:2010-01-27 05:21:54

标签: python windows 64-bit cross-platform 32bit-64bit

通常检查以区分在Windows上运行Python应用程序和其他操作系统(通常是Linux)是使用条件:

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

但是我想今天使用64位Python在过去几年中被广泛使用是否安全? 32真的意味着32位,还是基本上它指的是Win32 API?

如果有可能将一天的sys.platform作为'win64',那么这种情况会更普遍吗?

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

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

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

但我从未在其他代码中看到过后者的使用。

那么最好的方法是什么?

UPD :如果可以,我想避免使用额外的库。需要安装额外的库以检查我是否在Windows中工作可能对Linux用户来说很烦人。

4 个答案:

答案 0 :(得分:34)

无论基础Windows系统的位数如何,

sys.platform都将是win32,正如您在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"

可以在网上找到引入此内容的original patch,这提供了更多解释:

  

主要问题是:Win64是否更像Win32而不是普通案例的一般Python程序员不应该在他的Python代码中进行区分。或者,至少足以使Python脚本的这种区分足够罕见,以至于其他一些提供的机制就足够了(甚至更可取)。目前答案是肯定的。希望MS不会改变这个答案。

答案 1 :(得分:5)

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

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

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

答案 2 :(得分: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和unixy平台上运行。它有些难看但有效。

答案 3 :(得分:2)

Windows / 32和Windows / 64的警告是相同的,因此它们应该使用相同的值。唯一的区别在于例如sys.maxintctypes。如果您需要区分32和64,那么platform是最好的选择。