查看系統版本信息是一件屢見不鮮的事情,有時候須要將版本信息錄入到資產管理系統中,若是每次手動的去查詢這些信息再錄入系統那麼是一件使人呢頭疼的事情,若是採用腳本去完成這件事情,那麼狀況就有所不一樣了。python
在Python的世界裏,獲取Windows版本信息和Linux的版本信息均可以採用platform模塊,但platform模塊也不是萬能的,有些特殊的信息(好比Windows的內部版本號)這個模塊拿不到,那麼只能另闢蹊徑了。linux
在Linux系統中,能夠簡單的認爲一切都是文件,那麼就算沒有現成的命令可用時,能夠用open()文件的方法經過對文件的讀寫控制它。而在Windows的大部分信息在註冊表中都能查到,所以能夠從註冊表上下手。Windows註冊表是一個好東西,拿數據就像在Linux下一切都是文件同樣方便,若是想用Python訪問註冊表,除了權限外就是須要模塊了,在Python中_winreg是一個內置模塊,經過這一模塊能夠對註冊表進行讀寫。git
本腳本收集了一些獲取版本信息的常見方法,除了platform模塊外,還有其餘的模塊可供使用,由於platform模塊不是內置模塊,所以須要額外安裝。Windows下運行腳本須要考慮權限問題和中文字符的問題,解決Python打印中文字符的問題是經過腳本中的get_system_encoding()函數實現的,這個函數取自Django,通過測試這個函數仍是很是好用的。github
注:在PyCharm中,常常遇到Run窗口打印出的中文顯示亂碼,代碼中沒有通過正確轉碼是一方面,而IDE的編碼設置也是一方面。若是是在Windows下開發,那麼建議代碼用UTF-8編寫,IDE的編碼則設置爲「GBK」,設置方法「File」-->"Settings"-->"Editor"-->"File Encoding"-->"IDE Encoding"選擇「<System Default (now GBK)>」, "Project Encoding"選擇UTF-8保證代碼的編碼一致性。shell
腳本以下:windows
#!/usr/bin/python # encoding: utf-8 # -*- coding: utf8 -*- """ Created by PyCharm. File: LinuxBashShellScriptForOps:getSystemVersion.py User: Guodong Create Date: 2016/12/16 Create Time: 14:51 """ import sys import os import platform import subprocess import codecs import locale def get_system_encoding(): """ The encoding of the default system locale but falls back to the given fallback encoding if the encoding is unsupported by python or could not be determined. See tickets #10335 and #5846 """ try: encoding = locale.getdefaultlocale()[1] or 'ascii' codecs.lookup(encoding) except Exception: encoding = 'ascii' return encoding DEFAULT_LOCALE_ENCODING = get_system_encoding() mswindows = (sys.platform == "win32") # learning from 'subprocess' module linux = (sys.platform == "linux2") hidden_hostname = True if mswindows: uname = list(platform.uname()) if hidden_hostname: uname[1] = "hidden_hostname" print uname import _winreg try: reg_key = _winreg.OpenKey(_winreg.HKEY_LOCAL_MACHINE, "SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion") if reg_key: ProductName = _winreg.QueryValueEx(reg_key, "ProductName")[0] or None EditionId = _winreg.QueryValueEx(reg_key, "EditionId")[0] or None ReleaseId = _winreg.QueryValueEx(reg_key, "ReleaseId")[0] or None CurrentBuild = _winreg.QueryValueEx(reg_key, "CurrentBuild")[0] or None BuildLabEx = _winreg.QueryValueEx(reg_key, "BuildLabEx")[0][:9] or None print (ProductName, EditionId, ReleaseId, CurrentBuild, BuildLabEx) except Exception as e: print e.message.decode(DEFAULT_LOCALE_ENCODING) if linux: uname = list(platform.uname()) if hidden_hostname: uname[1] = "hidden_hostname" print uname proc_obj = subprocess.Popen(r'uname -a', shell=True, stdout=subprocess.PIPE, stderr=subprocess.STDOUT) result = proc_obj.stdout.read().strip().decode(DEFAULT_LOCALE_ENCODING) if result: print result if os.path.isfile("/proc/version"): with open("/proc/version", 'r') as f: content = f.read().strip() if content != "": print content if os.path.isfile("/etc/issue"): with open("/etc/issue", 'r') as f: content = f.read().strip() if content != "": print content
注:腳本內容能夠經過GitHub獲取,地址:https://github.com/DingGuodong/LinuxBashShellScriptForOps/blob/master/functions/system/getSystemVersion.py:。ide
截圖以下:函數
(1)註冊表信息獲取位置:測試
(2)Windows環境下的輸出:ui
(3)Linux環境下的輸出:
tag:Python 系統版本,Windows 內部版本,Python操做註冊表
--end--