When to use os.name, sys.platform, or platform.system?
Dived a bit into the source code.
The output of sys.platform
and os.name
are determined at compile time. platform.system()
determines the system type at run time.
-
sys.platform
is specified as a compiler define during the build configuration. -
os.name
checks whether certain os specific modules are available (e.g.posix
,nt
, ...) -
platform.system()
actually runsuname
and potentially several other functions to determine the system type at run time.
My suggestion:
- Use
os.name
to check whether it's a posix-compliant system. - Use
sys.platform
to check whether it's a linux, cygwin, darwin, atheos, etc. - Use
platform.system()
if you don't believe the other sources.
There is a thin line difference between platform.system()
and sys.platform
and interestingly for most cases platform.system()
degenerates to sys.platform
Here is what the Source Python2.7\Lib\Platform.py\system
says
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]
def uname():
# Get some infos from the builtin os.uname API...
try:
system,node,release,version,machine = os.uname()
except AttributeError:
no_os_uname = 1
if no_os_uname or not filter(None, (system, node, release, version, machine)):
# Hmm, no there is either no uname or uname has returned
#'unknowns'... we'll have to poke around the system then.
if no_os_uname:
system = sys.platform
release = ''
version = ''
node = _node()
machine = ''
Also per the documentation
os.uname()
Return a 5-tuple containing information identifying the current operating system. The tuple contains 5 strings: (sysname, nodename, release, version, machine). Some systems truncate the nodename to 8 characters or to the leading component; a better way to get the hostname is socket.gethostname() or even socket.gethostbyaddr(socket.gethostname()).
Availability: recent flavors of Unix.
From sys.platform
docs:
-
os.name
has a coarser granularity -
os.uname()
gives system-dependent version information - The
platform
module provides detailed checks for the system’s identity
Often the "best" future-proof way to test whether some functionality is available is just to try to use it and use a fallback if it fails.
what about the difference between sys.platform and platform.system()?
platform.system()
returns a normalized value that it might get from several sources: os.uname()
, sys.platform
, ver
command (on Windows).