49

区分在 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 用户感到恼火。

4

4 回答 4

45

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"

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

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

于 2010-01-27T09:07:15.800 回答
7

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

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

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

于 2010-01-27T06:32:06.593 回答
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 上,所以这种更改不可能在一夜之间完成。但是,os._nameJython 2.5.x 上已经有:

$ jython -c "import os; print os._name"
posix

就个人而言,我倾向于使用os.sep == '/'需要在 Jython 和 CPython 以及 Windows 和 unixy 平台上运行的代码。它有点丑陋但有效。

于 2010-09-02T10:37:36.703 回答
2

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

于 2010-01-27T05:26:33.860 回答