centos python_Python中你可能不知道的platform

v2-7a755109af45971c39ab0588729202b8_1440w.jpg?source=172ae18b

某次在查看测试机(Ubuntu)发行版本时,发现得到的结果并不准确;本应得到Ubuntu,结果显示的却是Debian,大致代码如下

...

项目使用的是可移植版的python(Anaconda),第一反应是用交互模式验证一下。

()

得出的结果却为Debian。既没有报错,也没有异常,那么问题是出在哪里了呢?

遂又使用系统自带的python验证。

()

然而系统得到的却是正确的结果,难道是移植版本的bug?


在同事的提醒下,意识到应该看一下platform模块的源码,看看问题是否出在这里。

首先,查看platform模块中的platform方法

...

当调用platform方法时,首先它会去模块缓存信息中查找,若有则直接返回。因为是第一次调用,缓存中肯定不会存有相应信息,这里可以跳过。

紧接着,通过uname方法获取system, node, release等信息,而uname方法主要是调用os.uname()获得相应信息。

()

尝试使用os.uname()后,除了能得到系统版本外发现并没有期望得到的相应发行版信息,跳过。

接下来则是dist()方法。发现dist()方法实际上调用的python_implementation()。最终确定,获取系统版本的关键就在python_implementation()方法中。

以下为比较可移植版的python和Ubuntu自带的python源码(具体行号可能存在些许偏差)

移植版python的platform模块源码:

...

Ubuntu系统自导python的platform模块源码:

···

首先可以看到,Ubuntu版本中platform的_supported_dists元组中多了一个Ubuntu元素,并且在linux_destribution方法中,首先会尝试读取/etc/lsb-release文件;接着通过正则匹配(_distributor_id_file_re, _release_file_re, _codename_file_re),查找相应的值,如果都有结果,则直接返回。

读取/etc/lsb-release,发现里面存了一些Ubuntu系统版本信息。

DISTRIB_ID

那么显然,三个正则都将匹配到对应的值,返回(Ubuntu, 16.04, xenial)。
最终,正确的获取到Ubuntu发行版本。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值