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

Posted

技术标签:

【中文标题】在 64 位 Python 上使用 sys.platform==\'win32\' 检查是不是安全?【英文标题】:Is it safe to use sys.platform=='win32' check on 64-bit Python?在 64 位 Python 上使用 sys.platform=='win32' 检查是否安全? 【发布时间】:2011-01-09 19:50:23 【问题描述】:

区分在 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':
    ...

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

那么最好的方法是什么?

UPD:如果可以的话,我想避免使用额外的库。需要安装额外的库来检查我是否在 Windows 中工作,这可能会让 Linux 用户感到恼火。

【问题讨论】:

这是一个很好的问题。谢谢。 【参考方案1】:

sys.platform 将是 win32,无论底层 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"

可以在网上找到介绍这个的original patch,它提供了更多解释:

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

【讨论】:

【参考方案2】:

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

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

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

【讨论】:

如果我能从 vanilla Python 中得到我需要的东西,我宁愿避免使用额外的依赖项。【参考方案3】:

请注意,您不能在 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 平台上运行的代码。这有点难看,但有效。

【讨论】:

对于 IronPython sys.platform == 'cli'.【参考方案4】:

Windows/32 和 Windows/64 的注意事项相同,因此它们应该使用相同的值。唯一的区别在于例如sys.maxintctypes。如果您无论如何都需要区分 32 和 64,那么platform 是您的最佳选择。

【讨论】:

我不太明白你的答案。你是说在 sys.platform 中使用 'win32' 构建 64 位 Python 吗?对我来说真正的问题是我没有 64 位机器来检查这个假设。 Windows/64 版本使用“win32”。 (显然其他 64 位操作系统没有)

以上是关于在 64 位 Python 上使用 sys.platform=='win32' 检查是不是安全?的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python 2.7.3 在 64 位 Windows 7 上安装 Numpy [关闭]

在 64 位 linux 上安装 python 32 位

在 64 位操作系统的 64 位 CPU 上运行 X86-64 Python 有啥好处吗?

在 64 位 python 上训练的 Scikit-Learn 随机森林不会在 32 位 python 上打开

如何在 Windows 上使用 64 位 Python 调试(可能与 C 库相关的)内存问题?

在 64 位 Windows 7 和 64 位 Python 2.7 上安装 Pygame