352

I found the platform module but it says it returns 'Windows' and it's returning 'Microsoft' on my machine. I notice in another thread here on stackoverflow it returns 'Vista' sometimes.

So, the question is, how do implemement?

if is_windows():
  ...

In a forward compatible way? If I have to check for things like 'Vista' then it will break when the next version of windows comes out.


Note: The answers claiming this is a duplicate question do not actually answer the question is_windows. They answer the question "what platform". Since many flavors of windows exist none of them comprehensively describe how to get an answer of isWindows.

3
  • Similar to stackoverflow.com/questions/196930/… Commented Aug 25, 2009 at 1:27
  • 4
    "There should be one-- and preferably only one --obvious way to do it." Alas, python gives us at least three ways.. Commented Aug 25, 2009 at 1:35
  • 2
    Nit: According to PEP8 you should prefer using the name is_windows over isWindows. Commented Jan 13, 2019 at 12:56

5 Answers 5

534

Python os module

Specifically for Python 3.6/3.7:

os.name: The name of the operating system dependent module imported. The following names have currently been registered: 'posix', 'nt', 'java'.

In your case, you want to check for 'nt' as os.name output:

import os

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

There is also a note on os.name:

See also sys.platform has a finer granularity. os.uname() gives system-dependent version information.

The platform module provides detailed checks for the system’s identity.

Sign up to request clarification or add additional context in comments.

10 Comments

'nt' is the value for windows
What does linux normally return? posix?
@AndiJay - yes, but should be easy enough to test!
@MartinBeckett - Not necessarily. You may not have a machine running Linux available.
@ArtOfWarfare you don't need a machine ;) onlinegdb.com/HyhJEzdX4 ( Well maybe in 2015 )
|
95

Are you using platform.system?

 system()
        Returns the system/OS name, e.g. 'Linux', 'Windows' or 'Java'.

        An empty string is returned if the value cannot be determined.

If that isn't working, maybe try platform.win32_ver and if it doesn't raise an exception, you're on Windows; but I don't know if that's forward compatible to 64-bit, since it has 32 in the name.

win32_ver(release='', version='', csd='', ptype='')
        Get additional version information from the Windows Registry
        and return a tuple (version,csd,ptype) referring to version
        number, CSD level and OS type (multi/single
        processor).

But os.name is probably the way to go, as others have mentioned.


For what it's worth, here's a few of the ways they check for Windows in platform.py:

if sys.platform == 'win32':
#---------
if os.environ.get('OS','') == 'Windows_NT':
#---------
try: import win32api
#---------
# Emulation using _winreg (added in Python 2.0) and
# sys.getwindowsversion() (added in Python 2.3)
import _winreg
GetVersionEx = sys.getwindowsversion
#----------
def system():

    """ Returns the system/OS name, e.g. 'Linux', 'Windows' or 'Java'.    
        An empty string is returned if the value cannot be determined.   
    """
    return uname()[0]

4 Comments

On a 64 bit machine, with Windows 7 (64 bit OS) this is the output: Python 3.1.1 (r311:74483, Aug 17 2009, 16:45:59) [MSC v.1500 64 bit (AMD64)] on win32 >>> print(sys.platform) win32 >>> platform.win32_ver() ('post2008Server', '6.1.7100', '', 'Multiprocessor Free') Note that the build explicitly calls it win32.
Oops, I thought the output would have been formatted better. hope you can read it anyway.
This should be the accepted answer.
platform.system returns different values on IOS then other operating systems. It's suggested in docs to use uname but os.uname likewise behaves differently on ios and android then other systems and platform.uname doesn't define what the valid list of potential system strings even is. Doesn't feel like the spec is nailed down enough to depend upon...
52

You should be able to rely on os.name.

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

edit: Now I'd say the clearest way to do this is via the platform module, as per the other answer.

Comments

45

in sys too:

import sys
# its win32, maybe there is win64 too?
is_windows = sys.platform.startswith('win')

3 Comments

I'm on 64 bit Windows and this gives me 'win32' :)
@Hut8 I just noticed the same thing.
I'm kind of certain it usually returns 'win32' regardless; at least I've only seen checks for that in code I read.
23
import platform
is_windows = any(platform.win32_ver())

or

import sys
is_windows = hasattr(sys, 'getwindowsversion')

Comments