何时使用os.name,sys.platform或platform.system?
据我所知,Python有三种方法可以找出在哪个操作系统上运行:
os.name
-
sys.platform
-
platform.system()
了解这些信息通常在条件导入中很有用,或者在不同平台之间使用不同的function(例如Windows上的time.clock()
与UNIX上的time.time()
)。
我的问题是,为什么3种不同的方式做到这一点? 什么时候应该使用一种方式而不是另一种方式 哪一种方法是“最好的”(最有前途的证据或最不可能排除你的程序实际运行的特定系统)?
看起来像sys.platform
比os.name
更具体,允许你从cygwin
(而不仅仅是nt
)和linux2
从darwin
(而不仅仅是posix
)区分win32
。 但是,如果是这样的话,那么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
,所以这个问题不是特别紧迫,但是我会非常感谢对此的一些澄清。
潜入一些源代码。
sys.platform
和os.name
的输出是在编译时确定的。 platform.system()
在运行时确定系统types。
-
sys.platform
在编译configuration期间被指定为编译器定义。 -
os.name
检查某些os特定模块是否可用(例如,posix
,nt
,…) -
platform.system()
实际上运行uname
和潜在的其他几个函数来确定运行时的系统types。
我的build议是,使用os.name
来检查它是否是posix兼容的系统,使用sys.platform
检查它是否是linux,cygwin,darwin,atheos等等,并且使用platform.system()
,好吧,相信其他来源。
platform.system()
和sys.platform
之间有细微的差别,有趣的是,在大多数情况下, platform.system()
退化为sys.platform
以下是Python2.7\Lib\Platform.py\system
所说的内容
def system(): """ Returns the system/OS name, eg '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个string:(sysname,nodename,release,version,machine)。 某些系统会将节点名截断为8个字符或导致组件; 获取主机名的更好方法是socket.gethostname(),甚至是socket.gethostbyaddr(socket.gethostname())。
Availability: recent flavors of Unix.
从sys.platform
文档 :
-
os.name
具有较粗的粒度 -
os.uname()
给出系统相关的版本信息 -
platform
模块提供对系统身份的详细检查
通常,testing某些function是否可用的“最好的”面向未来的方法就是尝试使用它,并在失败时使用回退。
什么sys.platform和platform.system()之间的区别?
platform.system()
返回一个规范化的值,它可以从几个来源获得: os.uname()
, sys.platform
, ver
命令(在Windows上)。
这取决于你是否喜欢在未经testing的系统上提出exception或尝试任何东西,以及你的代码是否如此高级别或者如此之低以至于它不能在类似的未经testing的系统上工作(例如,未经testing的Mac-“posix”或embedded式ARM系统)。 pythonic更多的是不列举所有已知的系统,而是testing可能的相关属性。 (例如,认为重要的是系统的永久性,但是不重要的多处理性质)。
-
os.name是正确使用
os
模块的足够的分辨率。 可能的值是'posix','nt','os2','ce'或'riscos',其中可能只有前两个最重要。 -
sys.platform是一个更好的决议。 build议使用
if sys.platform.startswith('linux')
成语,因为“linux2”意味着Linux内核版本2.xx或3.较早的内核目前从不使用。 在Python 3.3中,所有Linux系统都是简单的“linux”。
我不知道“Mac”和“Java”系统的具体情况,所以我不能使用非常好的方法platform.system()进行分支的结果,但是我会利用platform
模块的优点来处理消息和错误日志。
我相信平台模块可能是新代码的首选。 其他人存在之前。 这是一个进化,其余的则是向后兼容。