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

bia*_*lix 42 python windows 64-bit cross-platform 32bit-64bit

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

if sys.platform == 'win32':
    ...
Run Code Online (Sandbox Code Playgroud)

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

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

if sys.platform.startswith('win'):
    ...
Run Code Online (Sandbox Code Playgroud)

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

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

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

那么最好的方法是什么?

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

Tor*_*rek 38

sys.platformwin32不管底层的Windows系统的位数,你可以看到在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"
Run Code Online (Sandbox Code Playgroud)

可以找到在网络上引入此内容的原始补丁,它提供了更多解释:

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


Rei*_*ica 5

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

>>> from platinfo import PlatInfo
>>> pi = PlatInfo()
>>> pi.os
'win64'
>>> pi.arch
'x64'
>>> pi.name()
'win64-x64'
Run Code Online (Sandbox Code Playgroud)

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

  • 如果我可以从vanilla Python获得我需要的东西,我宁愿避免使用额外的依赖项. (3认同)

Pek*_*rck 5

请注意,您不能在Jython上使用sys.platformos.name为此:

$ jython -c "import sys, os; print sys.platform; print os.name"
java1.6.0_20
java
Run Code Online (Sandbox Code Playgroud)

我认为在Jython项目中有一个计划要改变os.name报告底层操作系统,就像CPython一样,但是因为人们正在使用它os.name == 'java'来检查它们是否在Jython上,这种改变不可能在一夜之间完成.但是,os._nameJython 2.5.x上已有:

$ jython -c "import os; print os._name"
posix
Run Code Online (Sandbox Code Playgroud)

我个人倾向于使用os.sep == '/'需要在Jython和CPython上运行的代码,以及Windows和unixy平台上运行的代码.它有些难看,但有效.