通常检查以区分在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用户来说很烦人。
答案 0 :(得分:34)
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.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和unixy平台上运行。它有些难看但有效。
答案 3 :(得分:2)
Windows / 32和Windows / 64的警告是相同的,因此它们应该使用相同的值。唯一的区别在于例如sys.maxint
和ctypes
。如果您需要区分32和64,那么platform
是最好的选择。