我最近有一个项目,使用Python在win32下开发一个COM组建,该COM组建其中一个方法是获取本地电脑的MAC地址。
需求很简单,虽然我是Python新手中的新手,但我还是会使用搜索引擎进行搜索。
百度一下,发现大部分都介绍使用import UUID获取MAC地址,或使用os.popen("ipconfig /all")的方式获取。而后者容易受到操作系统中英文环境影响。
如这篇文章:http://www.cnblogs.com/Jerryshome/archive/2011/11/30/2269365.html
所以,我很乖的使用了被大部分网页推荐的第一种方法,
def get_mac_address(): import uuid node = uuid.getnode() mac = uuid.UUID(int = node).hex[-12:] return mac
很幸运,直接能用。
然后用C++编写一个访问COM的程序。
但问题来了(我不会问学挖掘机哪家强的-_-///)
居然弹出C RUNTIME Error!!
--------------------------- Microsoft Visual C++ Runtime Library --------------------------- Runtime Error! Program: E:\Blender Foundation\blender.exe R6034 An application has made an attempt to load the C runtime library incorrectly. Please contact the application's support team for more information.
虽然功能能正常使用,但老是弹出这个对话框很不爽!
WINXP/WIN7 32位均出现该问题!!
经过一通科学上网,在如下网页发现:
https://developer.blender.org/T27666
导入UUID后,被C/C++等程序调用PYTHON程序,均会提示该问题,该bug未fixed掉,目前未有好的解决方案。原因是:ctypes loads wrong version of C runtime, leading to error message box from system
官网的buglist为:http://bugs.python.org/issue17213
OK,居然官网都没法解决,那只能换种方法了。
有经过一轮科学上网后,找到netifaces库,该方法和UUID一样,能通用的获取MAC地址。
库地址:https://pypi.python.org/pypi/netifaces
里面有相关教程,很简单,我贴出我写的demo程序,如下:
def networkinfo(self): import netifaces devlist = [] tempList = [] tmpdict = {} devices = netifaces.interfaces() for dev in devices: devlist.append(dev) for devinfo in devlist: infos = netifaces.ifaddresses(devinfo) if len(infos) < 2: continue ip = infos[netifaces.AF_INET][0]['addr'] if ip != '': if ip != '127.0.0.1': tmpdict["ip"] = ip tmpdict["mac"] = infos[netifaces.AF_LINK][0]['addr'] break tempList.append(tmpdict) return tempList
我这里获取了本地电脑的网络IP和该IP的网卡MAC地址。细节不做介绍了,大家可以看官网介绍。