Python 何时使用os.name、sys.platform或platform.system?
据我所知,Python有3种方法可以找出运行的操作系统:Python 何时使用os.name、sys.platform或platform.system?,python,operating-system,python-import,Python,Operating System,Python Import,据我所知,Python有3种方法可以找出运行的操作系统: os.name sys.platform platform.system() 了解这些信息通常在条件导入或使用不同平台的功能(例如Windows v.s上的time.clock(),UNIX上的time.time())时非常有用 我的问题是,为什么有三种不同的方法?什么时候应该使用一种方法而不是另一种?哪种方式是“最好的”(最经得起未来考验,或者最不可能意外地排除您的程序可以实际运行的特定系统) 似乎sys.platform比os.nam
os.name
sys.platform
platform.system()
time.clock()
,UNIX上的time.time()
)时非常有用
我的问题是,为什么有三种不同的方法?什么时候应该使用一种方法而不是另一种?哪种方式是“最好的”(最经得起未来考验,或者最不可能意外地排除您的程序可以实际运行的特定系统)
似乎sys.platform
比os.name
更具体,允许您区分win32
和cygwin
(而不仅仅是nt
),以及darwin
中的linux2
(而不仅仅是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
,因此这个问题并不特别紧迫,但我非常感谢您对此做出一些澄清。我相信平台模块可能是新代码的首选。其他人在它之前就存在了。这是一种进化,其他的保持向后兼容性。来自:
- 具有较粗的粒度
- 提供与系统相关的版本信息
- 该模块提供系统标识的详细检查
返回可能从多个源获取的规范化值:
os.uname()
,sys.platform
,ver
命令(在Windows上)。在源代码中插入了一点
sys.platform
和os.name
的输出在编译时确定platform.system()
确定运行时的系统类型
在构建配置期间被指定为编译器定义sys.platform
检查特定于操作系统的模块是否可用(例如os.name
,posix
,…)nt
platform.system()
- 使用
检查它是否是符合posix标准的系统os.name
- 使用
检查它是否是linux、cygwin、darwin、atheos等sys.platform
- 如果您不相信其他来源,请使用
platform.system()
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、,
发布、版本、机器)。有些系统将节点名截断为8
字符或到前导组件;一个更好的方法来获得
主机名是socket.gethostname()甚至
socket.gethostbyaddr(socket.gethostname())
这取决于您是否喜欢在未经测试的系统上引发异常或尝试任何操作,以及您的代码的级别是如此之高还是如此之低,以至于无法在类似的未经测试的系统上工作(例如,未经测试的Mac—“posix”或嵌入式ARM系统)。更多的python方法不是枚举所有已知的系统,而是测试可能的相关属性。(例如,系统的持久性被认为是重要的,但不重要的多处理特性。)
- os.name是正确使用
模块的足够分辨率。在Python2.7中,可能的值是'posix','nt','os2','ce','java'或'riscos',而自Python3.4以来只使用'posix','nt'和'java'os
- sys.platform是一个更精细的分辨率。建议使用
习惯用法,因为“linux2”表示linux内核版本2.xx或3。较旧的内核目前从未使用过。在Python 3.3中,所有Linux系统都是简单的“Linux”系统if sys.platform.startswith('linux')
我不知道“Mac”和“Java”系统的具体情况,因此我不能使用非常好的方法platform.system()的结果进行分支,但我会使用
平台模块的优点来进行消息和错误记录。我想知道我们是否能让Python开发人员确认这一点。甚至可能是开发平台模块的人。使用sys.platform.startswith('linux')
而不是sys.platform=='linux2'
,以实现未来的兼容性os.name
可能的返回值是'posix'
,'nt'
,'java'
。另见:。我不相信'riscos'
和'os2
'是来自os.name
的可能返回值;他们可能是。这个答案似乎并不详尽。@afeique:我更新了更新版Python的答案,但当时答案是正确的。请参阅(当时的最新版本)。Python2.7仍然受支持,“riscos”可能是它的一个价值。感谢@hynekcer,我感谢您编辑添加Python版本号。我很抱歉没有意识到它在Python 3.3之后发生了变化。我没有仔细阅读文档的不同版本,而是粗略地假设os.name
的Python3行为在不同版本之间是一致的
Availability: recent flavors of Unix.