何时使用os.name、sys.platform或platform.system?
据我所知,Python有三种方法可以找出当前运行的操作系统:
os.name
sys.platform
platform.system()
知道这些信息通常在条件导入或者使用不同平台的功能时很有用(比如在Windows上用time.clock()
,而在UNIX上用time.time()
)。
我的问题是,为什么会有三种不同的方法呢?什么时候应该用一种方法而不是另一种呢?哪种方法是“最好”的(最具未来适应性,或者最不容易意外排除某个实际上可以运行你程序的系统)?
看起来sys.platform
比os.name
更具体,可以让你区分win32
和cygwin
(而不仅仅是nt
),以及linux2
和darwin
(而不仅仅是posix
)。但如果是这样,那sys.platform
和platform.system()
之间又有什么区别呢?
例如,下面哪种写法更好:
import sys
if sys.platform == 'linux2':
# Do Linux-specific stuff
还是这个更好?:
import platform
if platform.system() == 'Linux':
# Do Linux-specific stuff
目前我会继续使用sys.platform
,所以这个问题并不是特别紧急,但我会非常感激能得到一些关于这个问题的澄清。
6 个回答
来自 sys.platform
文档 的内容:
os.name
提供的信息比较粗略os.uname()
能给出与系统相关的版本信息platform
模块提供了更详细的系统身份检查
通常,测试某个功能是否可用的“最佳”方法就是直接尝试使用它,如果失败了再用备用方案。
那
sys.platform
和platform.system()
有什么区别呢?
platform.system()
返回一个标准化的值,这个值可能来自多个来源:os.uname()
、sys.platform
,还有 Windows 上的 ver
命令。
在 platform.system()
和 sys.platform
之间有一个微妙的区别,值得注意的是,在大多数情况下,platform.system()
实际上会变成 sys.platform
的结果。
以下是源代码 Python2.7\Lib\Platform.py\system
的内容:
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 = ''
根据文档的说明:
os.uname()
这个函数会返回一个包含5个元素的元组,用来识别当前的操作系统。这个元组包含5个字符串: (sysname, nodename, release, version, machine)。有些系统会把 nodename 截断到8个字符或者只显示前面的部分;获取主机名的更好方法是使用 socket.gethostname(),或者甚至可以用 socket.gethostbyaddr(socket.gethostname())。
Availability: recent flavors of Unix.
稍微看了一下源代码。
sys.platform
和 os.name
的输出是在编译时就确定的,而 platform.system()
是在运行时确定系统类型的。
sys.platform
是在构建配置时作为编译器的定义来指定的。os.name
会检查某些特定操作系统的模块是否可用(比如posix
、nt
等等)。platform.system()
实际上会运行uname
以及可能的其他几个函数,以在运行时确定系统类型。
我的建议:
- 使用
os.name
来检查是否是符合 posix 标准的系统。 - 使用
sys.platform
来检查是否是 linux、cygwin、darwin、atheos 等等。 - 如果你对其他来源的信息不太相信,可以使用
platform.system()
。