问题:何时使用os.name,sys.platform或platform.system?
据我所知,Python有3种方法来找出运行什么操作系统:
os.name
sys.platform
platform.system()
知道此信息对于有条件导入或使用不同平台之间的功能(例如,time.clock()
在Windows和time.time()
UNIX上)通常很有用。
我的问题是,为什么要使用3种不同的方法?什么时候应该使用一种方法而不是另一种方法?哪种方法是“最佳”的(最好是面向未来的,或者最不可能偶然排除程序可以实际运行的特定系统)?
好像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
下去,因此这个问题并不是特别紧迫,但我将非常感谢您对此进行的澄清。
回答 0
深入研究源代码。
的输出sys.platform
和os.name
在编译时被确定。platform.system()
确定运行时的系统类型。
sys.platform
在构建配置期间被指定为编译器定义。os.name
检查是否某些操作系统特定模块可供选择(例如posix
,nt
,…)platform.system()
实际运行uname
以及可能在运行时确定系统类型的其他几个功能。
我的建议:
- 使用
os.name
来检查它是否是一个POSIX兼容的系统。 - 使用
sys.platform
来检查它是否是一个linux,cygwin的,达尔文,atheos等。 - 使用
platform.system()
,如果你不相信的其他来源。
回答 1
有一线之隔差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个字符串:(系统名称,节点名称,发行版,版本,计算机)。某些系统将节点名截断为8个字符或开头部分;获得主机名的更好方法是socket.gethostname()甚至socket.gethostbyaddr(socket.gethostname())。
Availability: recent flavors of Unix.
回答 2
os.name
粒度较粗os.uname()
提供与系统有关的版本信息- 该
platform
模块提供对系统身份的详细检查
通常,测试某些功能是否可用的“最好的”面向未来的方法只是尝试使用它,并在失败时使用备用。
sys.platform和platform.system()之间的区别如何?
回答 3
这取决于您是希望在未测试的系统上引发异常还是尝试任何操作,以及您的代码是否如此高级或如此之低,以至于它在类似的未经测试的系统(例如未经测试的Mac-‘posix’或嵌入式ARM系统)。更多的pythonic方法不是枚举所有已知系统,而是测试可能的相关属性。(例如,重要的是系统的持久性,但不重要的多处理属性。)
os.name是正确使用
os
模块的足够分辨率。可能的值为Python 2.7中的’posix’,’nt’,’os2’,’ce’,’java’或’riscos’,而自Python 3.4起仅使用’posix’,’nt’和’java’。sys.platform是更好的解决方案。建议使用
if sys.platform.startswith('linux')
成语,因为“ linux2”表示Linux内核版本为2.xx或3。目前从未使用过较早的内核。在Python 3.3中,所有Linux系统都是简单的“ Linux”。
我不知道“ Mac”和“ Java”系统的详细信息,因此我不能使用非常好的方法platform.system()的结果进行分支,但是我将利用platform
模块的优势进行消息和错误记录。
回答 4
我相信平台模块可能是新代码的首选。其他人在此之前存在。这是一个演变,其余的则是为了向后兼容。